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 2022/01/24 17:36:38 UTC

[isis] branch master updated: ISIS-2944: fixes orphaned member support detection when using Introspection.ANNOTATION_REQUIRED

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 96663bb  ISIS-2944: fixes orphaned member support detection when using Introspection.ANNOTATION_REQUIRED
96663bb is described below

commit 96663bb12ae13905dbe8ddefe6e2e0fa389d1e7b
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Jan 24 18:29:27 2022 +0100

    ISIS-2944: fixes orphaned member support detection when using
    Introspection.ANNOTATION_REQUIRED
    
    - also refactors UNSATISFIED_DOMAIN_INCLUDE_SEMANTICS into
    ProgrammingModelConstants
---
 .../progmodel/ProgrammingModelConstants.java       | 14 ++++++++---
 ...tionEnforcesMetamodelContributionValidator.java | 16 ++++++------
 .../_OrphanedSupportingMethodValidator.java        |  4 +--
 .../specloader/specimpl/FacetedMethodsBuilder.java |  3 +--
 .../DomainModelTest_usingBadDomain.java            | 29 ++++++++--------------
 5 files changed, 31 insertions(+), 35 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index e1e4502..d2bb56b 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -320,13 +320,21 @@ public final class ProgrammingModelConstants {
                 + "consider either removing the @Title annotation or renaming the method"),
         ORPHANED_METHOD("${type}#${member}: is public, but orphaned (was not picked up by the framework); "
                 + "reporting orphans, because the class is setup for member introspection, "
-                + "without enforcing annotations")
+                + "without enforcing annotations"),
+        UNSATISFIED_DOMAIN_INCLUDE_SEMANTICS("${type}#${member}: "
+                + "has synthesized (effective) annotation @Domain.Include, "
+                + "is assumed to represent or support a property, collection or action.");
         ;
         private final String template;
         public String getMessage(final Identifier featureIdentifier) {
+            return getMessageForTypeAndMemberId(
+                    featureIdentifier.getLogicalType().getClassName(),
+                    featureIdentifier.getMemberLogicalName());
+        }
+        public String getMessageForTypeAndMemberId(final String type, final String memberId) {
             return getMessage(Map.of(
-                    "type", featureIdentifier.getLogicalType().getClassName(),
-                    "member", featureIdentifier.getMemberLogicalName()));
+                    "type", type,
+                    "member", memberId));
         }
         public String getMessage(final Map<String, String> templateVars) {
             return processMessageTemplate(template, templateVars);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
index 4f16df9..ca5b830 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
@@ -35,6 +35,7 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.commons.internal.reflection._ClassCache;
 import org.apache.isis.commons.internal.reflection._Reflect;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.Validation;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -58,11 +59,6 @@ extends MetaModelVisitingValidatorAbstract {
 
     private final _ClassCache classCache;
 
-    /** exposed in support of JUnit tests */
-    public static String VALIDATION_MESSAGE_TEMPLATE = "%s#%s: "
-            + "has synthesized (effective) annotation @%s, "
-            + "is assumed to represent or support a property, collection or action.";
-
     @Inject
     public DomainIncludeAnnotationEnforcesMetamodelContributionValidator(final MetaModelContext mmc) {
         super(mmc);
@@ -134,10 +130,12 @@ extends MetaModelVisitingValidatorAbstract {
                     .collect(Collectors.joining("; "));
 
             ValidationFailure.raiseFormatted(spec,
-                    VALIDATION_MESSAGE_TEMPLATE + " Unmet constraint(s): %s",
-                    spec.getFeatureIdentifier().getClassName(),
-                    _Reflect.methodToShortString(notPickedUpMethod),
-                    "Domain.Include",
+                    Validation.UNSATISFIED_DOMAIN_INCLUDE_SEMANTICS
+                    .getMessageForTypeAndMemberId(
+                            spec.getFeatureIdentifier().getClassName(),
+                            _Reflect.methodToShortString(notPickedUpMethod)
+                            )
+                    + " Unmet constraint(s): %s",
                     unmetContraints);
         });
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/_OrphanedSupportingMethodValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/_OrphanedSupportingMethodValidator.java
index ab4f1b3..6dd2a1b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/_OrphanedSupportingMethodValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/_OrphanedSupportingMethodValidator.java
@@ -42,8 +42,8 @@ class _OrphanedSupportingMethodValidator {
                 || spec.getBeanSort().isManagedBeanNotContributing()
                 || spec.isValue()
                 || spec.getIntrospectionPolicy()
-                    .getMemberAnnotationPolicy()
-                    .isMemberAnnotationsRequired()) {
+                    .getSupportMethodAnnotationPolicy()
+                    .isSupportMethodAnnotationsRequired()) {
             return; // ignore
         }
 
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 d780a84..05a204e 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
@@ -33,8 +33,8 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
+import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -491,7 +491,6 @@ implements HasMetaModelContext {
         // exclude those that have eg. reserved prefixes
         if (getFacetProcessor().recognizes(actionMethod)) {
             // this is a potential orphan candidate, collect these, than use when validating
-
             inspectedTypeSpec.getPotentialOrphans().add(actionMethod);
             return false;
         }
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
index 587d0fc..e0074c4 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
@@ -49,7 +49,7 @@ import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
-import org.apache.isis.core.metamodel.methods.DomainIncludeAnnotationEnforcesMetamodelContributionValidator;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.Validation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.bad.AmbiguousMixinAnnotations;
@@ -121,8 +121,7 @@ class DomainModelTest_usingBadDomain {
                 Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedActionSupport.class)),
                 validationMessage(
                         "InvalidOrphanedActionSupport",
-                        "hideOrphaned()",
-                        "Domain.Include"));
+                        "hideOrphaned()"));
 
         val tester = testerFactory.objectTester(InvalidOrphanedActionSupport.class);
 
@@ -137,8 +136,7 @@ class DomainModelTest_usingBadDomain {
                 Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedPropertySupport.class)),
                 validationMessage(
                         "InvalidOrphanedPropertySupport",
-                        "hideMyProperty()",
-                        "Domain.Include"));
+                        "hideMyProperty()"));
 
         val tester = testerFactory.objectTester(InvalidOrphanedPropertySupport.class);
 
@@ -152,8 +150,7 @@ class DomainModelTest_usingBadDomain {
                 Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedCollectionSupport.class)),
                 validationMessage(
                         "InvalidOrphanedCollectionSupport",
-                        "hideMyCollection()",
-                        "Domain.Include"));
+                        "hideMyCollection()"));
 
         val tester = testerFactory.objectTester(InvalidOrphanedCollectionSupport.class);
 
@@ -193,16 +190,14 @@ class DomainModelTest_usingBadDomain {
                         InvalidMemberOverloadingWhenInherited.WhenAnnotationRequired.class)),
                 validationMessage(
                         "",
-                        "isActive()",
-                        "Domain.Include"));
+                        "isActive()"));
 
         validator.assertAnyFailuresContaining(
                 Identifier.classIdentifier(LogicalType.fqcn(
                         InvalidMemberOverloadingWhenInherited.WhenEncapsulationEnabled.class)),
                 validationMessage(
                         "",
-                        "isActive()",
-                        "Domain.Include"));
+                        "isActive()"));
     }
 
     @Test
@@ -275,7 +270,7 @@ class DomainModelTest_usingBadDomain {
     @ParameterizedTest
     @ValueSource(classes = {
             OrphanedMemberSupportDetection.WhenEncapsulationEnabled.class,
-            //FIXME OrphanedMemberSupportDetection.WhenAnnotationRequired.class,
+            OrphanedMemberSupportDetection.WhenAnnotationRequired.class,
             OrphanedMemberSupportDetection.WhenAnnotationOptional.class
             })
     void orphanedMemberSupportDiscovery(final Class<?> classUnderTest) {
@@ -385,13 +380,9 @@ class DomainModelTest_usingBadDomain {
 
     private String validationMessage(
             final String className,
-            final String memberName,
-            final String annotationName) {
-        return String.format(
-                DomainIncludeAnnotationEnforcesMetamodelContributionValidator.VALIDATION_MESSAGE_TEMPLATE,
-                className,
-                memberName,
-                annotationName);
+            final String memberName) {
+        return Validation.UNSATISFIED_DOMAIN_INCLUDE_SEMANTICS
+                .getMessageForTypeAndMemberId(className, memberName);
     }
 
 }