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 2021/09/09 19:17:25 UTC

[isis] branch master updated: ISIS-2774: fail early if conflicting title strategies

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 960d53a  ISIS-2774: fail early if conflicting title strategies
960d53a is described below

commit 960d53a62d1752b6cdebd32add7a29baca74df26
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 9 21:17:09 2021 +0200

    ISIS-2774: fail early if conflicting title strategies
---
 .../config/progmodel/ProgrammingModelConstants.java   | 19 +++++++++++++++++++
 .../annotation/TitleFacetViaTitleAnnotation.java      | 16 ++++++++++++++++
 2 files changed, 35 insertions(+)

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 ac4e821..8c6e677 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
@@ -34,6 +34,7 @@ import javax.enterprise.inject.Vetoed;
 import org.springframework.lang.Nullable;
 import org.springframework.util.ClassUtils;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Domain;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.ObjectLifecycle;
@@ -309,6 +310,18 @@ public final class ProgrammingModelConstants {
         }
     }
 
+    //FIXME[ISIS-2774] consolidate all MM validation raisers here, if we can find a common method signature for that
+    @RequiredArgsConstructor
+    public static enum Validation {
+        CONFLICTING_TITLE_STRATEGIES(
+                "${type} has title() method with @Title annotation, which is not allowed; "
+                + "consider either removing the @Title annotation or renaming the method");
+        private final String template;
+        public String getMessage(final Identifier identifier) {
+            return processMessageTemplate(template, identifier);
+        }
+    }
+
     // -- HELPER
 
     private static String getCapitalizedMemberName(final Member member) {
@@ -328,5 +341,11 @@ public final class ProgrammingModelConstants {
         return _Strings.capitalize(member.getName());
     }
 
+    private static String processMessageTemplate(
+            final String template,
+            final Identifier identifier) {
+        return template.replace("${type}", identifier.getLogicalType().getClassName());
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index 4e3c29f..1ac0cb1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -36,6 +36,8 @@ import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.commons.internal.reflection._Reflect.InterfacePolicy;
 import org.apache.isis.commons.internal.reflection._Reflect.TypeHierarchyPolicy;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.Validation;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.Evaluators;
 import org.apache.isis.core.metamodel.facets.Evaluators.MethodEvaluator;
@@ -43,6 +45,7 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -67,6 +70,7 @@ implements ImperativeFacet {
                     annotatedElement->isTitleComponent(annotatedElement, titleRef::set),
                     TypeHierarchyPolicy.EXCLUDE,
                     InterfacePolicy.INCLUDE)
+                .filter(evaluator->!isATitleProvidingObjectSupportMethod(evaluator, holder))
                 .map(evaluator->TitleComponent.of(evaluator, titleRef.getValueElseFail()))
                 .sorted()
                 .collect(Can.toCan());
@@ -190,6 +194,18 @@ implements ImperativeFacet {
                 .orElse(false);
     }
 
+    private static boolean isATitleProvidingObjectSupportMethod(
+            final Evaluators.Evaluator evaluator,
+            final FacetHolder facetHolder) {
+        if(ObjectSupportMethod.TITLE.getMethodNames().contains(evaluator.name())) {
+            ValidationFailure.raise(facetHolder,
+                    Validation.CONFLICTING_TITLE_STRATEGIES
+                    .getMessage(facetHolder.getFeatureIdentifier()));
+            return true;
+        }
+        return false;
+    }
+
     @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
     public static class TitleComponent
     implements Comparable<TitleComponent> {