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/07/06 12:05:45 UTC

[isis] branch master updated: ISIS-2791: TitleFacetViaMethodsFactory needs to unconditionally remove toString method from action candidates

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 29387ad  ISIS-2791: TitleFacetViaMethodsFactory needs to unconditionally remove toString method from action candidates
29387ad is described below

commit 29387ad3b3e7c262ab264d4951ae2ab4eefacf50
Author: andi-huber <ah...@apache.org>
AuthorDate: Tue Jul 6 14:05:31 2021 +0200

    ISIS-2791: TitleFacetViaMethodsFactory needs to unconditionally remove
    toString method from action candidates
---
 .../title/methods/TitleFacetViaMethodsFactory.java | 57 ++++++++++++++--------
 1 file changed, 36 insertions(+), 21 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
index 6be2c8c..de0b5f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.title.methods;
 
 import java.lang.reflect.Method;
 
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.services.i18n.TranslationContext;
@@ -28,7 +29,6 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
@@ -41,6 +41,10 @@ import static org.apache.isis.core.metamodel.methods.MethodLiteralConstants.TO_S
 
 import lombok.val;
 
+/**
+ * @implNote removes the {@link Object#toString()} method as action candidate,
+ * regardless of whether this method is used for the domain-object's title or not
+ */
 public class TitleFacetViaMethodsFactory
 extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -59,45 +63,56 @@ extends MethodPrefixBasedFacetFactoryAbstract {
      */
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+        val cls = processClassContext.getCls();
+        val facetHolder = processClassContext.getFacetHolder();
 
-        Method method = MethodFinderUtils.findMethod_returningText(
+        val titleMethod = MethodFinderUtils.findMethod_returningText(
                 cls,
                 TITLE,
                 NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
+        if (titleMethod != null) {
+            processClassContext.removeMethod(titleMethod);
             // sadness: same as in TranslationFactory
-            val translationContext = TranslationContext.forMethod(method);
+            val translationContext = TranslationContext.forMethod(titleMethod);
 
             FacetUtil.addFacet(
                     new TitleFacetViaTitleMethod(
-                            method, translationContext, facetHolder));
+                            titleMethod, translationContext, facetHolder));
+
+            removeToString(processClassContext);
             return;
         }
 
         // may have a facet by virtue of @Title, say.
-        final TitleFacet existingTitleFacet = facetHolder.lookupNonFallbackFacet(TitleFacet.class)
-                .orElse(null);
-        if(existingTitleFacet != null) {
+        val existingTitleFacet = facetHolder.lookupNonFallbackFacet(TitleFacet.class);
+        if(existingTitleFacet.isPresent()) {
+            removeToString(processClassContext);
             return;
         }
 
         try {
-            method = MethodFinderUtils.findMethod(cls, TO_STRING, String.class, null);
-            if (method == null) {
-                return;
-            }
-            if (ClassExtensions.isJavaClass(method.getDeclaringClass())) {
-                return;
+            val toStringMethod = removeToString(processClassContext);
+            if (toStringMethod != null) {
+                if(!ClassExtensions.isJavaClass(toStringMethod.getDeclaringClass())) {
+                    FacetUtil.addFacet(new TitleFacetInferredFromToStringMethod(toStringMethod, facetHolder));
+                }
             }
-            processClassContext.removeMethod(method);
-            FacetUtil.addFacet(new TitleFacetInferredFromToStringMethod(method, facetHolder));
-
         } catch (final Exception e) {
-            return;
+            // ignore
         }
+
     }
 
+    // -- HELPER
+
+    private @Nullable Method removeToString(final ProcessClassContext processClassContext) {
+        val cls = processClassContext.getCls();
+        val toStringMethod = MethodFinderUtils.findMethod(cls, TO_STRING, String.class, null);
+        if (toStringMethod != null) {
+            processClassContext.removeMethod(toStringMethod);
+        }
+        return toStringMethod;
+    }
+
+
 }