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/01 09:59:46 UTC

[isis] branch master updated: ISIS-2774: fixes object level visibility and usability support method detection

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 ee7d6ee  ISIS-2774: fixes object level visibility and usability support method detection
ee7d6ee is described below

commit ee7d6eea4de45f2776e62677cd4ed3be98fa479f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 1 11:59:35 2021 +0200

    ISIS-2774: fixes object level visibility and usability support method
    detection
---
 .../method/DisabledObjectFacetViaMethod.java       |  8 ++---
 .../DisabledObjectFacetViaMethodFactory.java       |  7 ++--
 .../method/HiddenObjectFacetViaMethodFactory.java  | 37 +++++++---------------
 .../DomainModelTest_usingGoodDomain.java           | 10 ++++--
 ...lWithAnnotationOptionalUsingPrivateSupport.java | 22 +++++++++++--
 .../interaction/DomainObjectTesterFactory.java     | 32 +++++++++++++++++--
 6 files changed, 72 insertions(+), 44 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
index fa9ea1e..7dc3b13 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.Identifier.Type;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
@@ -43,17 +42,14 @@ extends DisabledObjectFacetAbstract
 implements ImperativeFacet {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-    private TranslationService translationService;
     private final TranslationContext translationContext;
 
     public DisabledObjectFacetViaMethod(
             final Method method,
-            final TranslationService translationService,
             final TranslationContext translationContext,
             final FacetHolder holder) {
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationService = translationService;
         this.translationContext = translationContext;
     }
 
@@ -72,7 +68,7 @@ implements ImperativeFacet {
         }
         if(returnValue instanceof TranslatableString) {
             final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
+            return ts.translate(getTranslationService(), translationContext);
         }
         return null;
     }
@@ -86,7 +82,7 @@ implements ImperativeFacet {
     @Override
     public DisabledObjectFacetViaMethod clone(final FacetHolder holder) {
         val method = methods.getFirstOrFail();
-        return new DisabledObjectFacetViaMethod(method, translationService, translationContext, holder);
+        return new DisabledObjectFacetViaMethod(method, translationContext, holder);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
index 86cb128..8f91beb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.object.disabled.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -64,23 +63,21 @@ extends MethodPrefixBasedFacetFactoryAbstract {
     public void process(final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val paramTypes = new Class<?>[] {Identifier.Type.class};
 
         val method = MethodFinderUtils.findMethod_returningText(
                 MethodFinderOptions
                 .objectSupport(processClassContext.getIntrospectionPolicy()),
                 cls,
                 METHOD_NAME,
-                paramTypes);
+                NO_ARG);
         if (method == null) {
             return;
         }
 
-        val translationService = getTranslationService();
         // sadness: same logic as in I18nFacetFactory
         val translationContext = TranslationContext.forMethod(method);
 
-        addFacet(new DisabledObjectFacetViaMethod(method, translationService, translationContext, facetHolder));
+        addFacet(new DisabledObjectFacetViaMethod(method, translationContext, facetHolder));
 
         processClassContext.removeMethod(method);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethodFactory.java
index 788c019..92f6f9d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/method/HiddenObjectFacetViaMethodFactory.java
@@ -19,13 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.object.hidden.method;
 
-import java.lang.reflect.Method;
-
 import javax.inject.Inject;
 
 import org.apache.isis.commons.collections.Can;
 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.FacetFactory;
@@ -63,12 +60,18 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        for (final Class<?> returnType : new Class<?>[] { Boolean.class, boolean.class }) {
-            if (addFacetIfMethodFound(processClassContext, returnType)) {
-                return;
-            }
+        val cls = processClassContext.getCls();
+        val facetHolder = processClassContext.getFacetHolder();
+
+        val method = MethodFinderUtils.findMethod_returningBoolean(
+                MethodFinderOptions
+                .objectSupport(processClassContext.getIntrospectionPolicy()),
+                cls, METHOD_NAME, NO_ARG);
+        if (method == null) {
+            return;
         }
-        return;
+        addFacet(new HiddenObjectFacetViaMethod(method, facetHolder));
+        processClassContext.removeMethod(method);
     }
 
     @Override
@@ -82,22 +85,4 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         .ifPresent(FacetUtil::addFacet);
     }
 
-    private boolean addFacetIfMethodFound(
-            final ProcessClassContext processClassContext,
-            final Class<?> returnType) {
-        final Class<?> cls = processClassContext.getCls();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-
-        final Method method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .objectSupport(processClassContext.getIntrospectionPolicy()),
-                cls, METHOD_NAME, returnType, NO_ARG);
-        if (method == null) {
-            return false;
-        }
-        FacetUtil.addFacet(new HiddenObjectFacetViaMethod(method, facetHolder));
-        processClassContext.removeMethod(method);
-        return true;
-    }
-
 }
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 6020dbb..a5d79f7 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -515,7 +516,8 @@ class DomainModelTest_usingGoodDomain {
         act.assertExists(true);
         act.assertIsExplicitlyAnnotated(true);
         act.assertVisibilityIsNotVetoed();
-        act.assertUsabilityIsVetoedWith("action disabled for testing purposes");
+        act.assertUsabilityIsVetoedWithAll(
+                Can.of("object disabled for testing purposes", "action disabled for testing purposes"));
         act.assertInvocationResult("Hallo World!", List.of());
 
         // -- PROPERTY WITH PRIVATE GETTER AND SETTER
@@ -525,7 +527,8 @@ class DomainModelTest_usingGoodDomain {
         prop.assertExists(true);
         prop.assertIsExplicitlyAnnotated(true);
         prop.assertVisibilityIsNotVetoed();
-        prop.assertUsabilityIsVetoedWith("property disabled for testing purposes");
+        prop.assertUsabilityIsVetoedWithAll(
+                Can.of("object disabled for testing purposes", "property disabled for testing purposes"));
         prop.assertValue("Foo");
         prop.assertValueUpdate("Bar");
 
@@ -536,7 +539,8 @@ class DomainModelTest_usingGoodDomain {
         coll.assertExists(true);
         coll.assertIsExplicitlyAnnotated(true);
         coll.assertVisibilityIsNotVetoed();
-        coll.assertUsabilityIsVetoedWith("collection disabled for testing purposes");
+        coll.assertUsabilityIsVetoedWithAll(
+                Can.of("object disabled for testing purposes", "collection disabled for testing purposes"));
         coll.assertCollectionElements(List.of("Foo"));
     }
 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ViewModelWithAnnotationOptionalUsingPrivateSupport.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ViewModelWithAnnotationOptionalUsingPrivateSupport.java
index 4db5a3d..d0ba85e 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ViewModelWithAnnotationOptionalUsingPrivateSupport.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ViewModelWithAnnotationOptionalUsingPrivateSupport.java
@@ -46,6 +46,8 @@ implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    // -- PUBLIC ACTION WITH PRIVATE SUPPORT
+
     @Action
     public String myAction() {
         return "Hallo World!";
@@ -57,7 +59,7 @@ implements Serializable {
         return "action disabled for testing purposes";
     }
 
-    // -- PROPERTY WITH PRIVATE GETTER AND SETTER
+    // -- PROPERTY WITH PUBLIC GETTER AND SETTER, PRIVATE SUPPORT
 
     @Property
     @Getter @Setter
@@ -69,7 +71,7 @@ implements Serializable {
         return "property disabled for testing purposes";
     }
 
-    // -- COLLECTION WITH PRIVATE GETTER AND SETTER
+    // -- COLLECTION WITH PUBLIC GETTER AND SETTER, PRIVATE SUPPORT
 
     @Collection
     @Getter @Setter
@@ -81,5 +83,21 @@ implements Serializable {
         return "collection disabled for testing purposes";
     }
 
+    // -- PRIVATE OBJECT SUPPORT
+
+    // allowed to be private since 2.0.0-M7
+    @MemberSupport//FIXME[ISIS-2774] be more specific, don't allow @MemberSupport
+    private String disabled() {
+        return "object disabled for testing purposes";
+    }
+
+    // allowed to be private since 2.0.0-M7
+    @MemberSupport//FIXME[ISIS-2774] be more specific, don't allow @MemberSupport
+    private boolean hidden() {
+        return false;
+    }
+
+    // -- PRIVATE OBJECT LAYOUT SUPPORT
+
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
index b01929b..4c26794 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.isis.core.metamodel.interactions.managed.CollectionInteraction;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
@@ -335,6 +336,33 @@ public class DomainObjectTesterFactory {
             assertUsabilityIsVetoedWith(null);
         }
 
+        public final void assertUsabilityIsVetoedWithAll(final Can<String> expectedVetoReasons) {
+
+            assertExists(true);
+
+            managedMemberIfAny
+            .ifPresent(managedCollection->{
+                interactionService.runAnonymous(()->{
+                    final String actualVetoReason = managedCollection
+                            .checkUsability()
+                            .map(veto->veto.getReason())
+                            .orElse(null);
+
+                    if(!expectedVetoReasons.isEmpty()
+                            && actualVetoReason==null) {
+                        fail("usability not vetoed, while expecting all of: " + expectedVetoReasons.toList());
+                    }
+
+                    expectedVetoReasons
+                    .forEach(expectedVetoReason->{
+                        assertTrue(actualVetoReason.contains(expectedVetoReason),
+                               ()->String.format("usability veto %s is not containing %s",
+                                       actualVetoReason, expectedVetoReason));
+                    });
+                });
+            });
+        }
+
         public final void assertUsabilityIsVetoedWith(final @Nullable String expectedVetoReason) {
 
             final boolean isExpectedUsable = expectedVetoReason == null;
@@ -346,12 +374,12 @@ public class DomainObjectTesterFactory {
             managedMemberIfAny
             .ifPresent(managedCollection->{
                 interactionService.runAnonymous(()->{
-                    final String actualVetoResaon = managedCollection
+                    final String actualVetoReason = managedCollection
                             .checkUsability()
                             .map(veto->veto.getReason())
                             .orElse(null);
 
-                        assertEquals(expectedVetoReason, actualVetoResaon);
+                        assertEquals(expectedVetoReason, actualVetoReason);
                 });
             });
         }