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/05/28 11:01:35 UTC

[isis] branch master updated: ISIS-2705: don't consider all elements when reducing on predicates

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 3e34f2b  ISIS-2705: don't consider all elements when reducing on predicates
3e34f2b is described below

commit 3e34f2bcfff1de473139e618d1ba2f65c3abb11e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 28 13:01:17 2021 +0200

    ISIS-2705: don't consider all elements when reducing on predicates
    
    as there are potential shortcuts
---
 .../HiddenTypeFacetDerivedFromAuthorization.java   | 79 +++++++++-------------
 .../metamodel/interactions/InteractionContext.java |  2 +-
 .../authorization/AuthorizationFacet.java          | 55 ++++++++++++++-
 3 files changed, 86 insertions(+), 50 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
index d507dd3..96890e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/HiddenTypeFacetDerivedFromAuthorization.java
@@ -22,9 +22,6 @@ package org.apache.isis.core.metamodel.facets.object.hidden;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.interactions.ActionVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.postprocessors.allbutparam.authorization.AuthorizationFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -45,53 +42,39 @@ public class HiddenTypeFacetDerivedFromAuthorization extends FacetAbstract imple
     @Override
     public String hides(final VisibilityContext vc) {
         val specification = (ObjectSpecification) getFacetHolder();
-        val beanSort = specification.getBeanSort();
-        switch (beanSort) {
-            case ABSTRACT:
-            case VIEW_MODEL:
-            case ENTITY:
-                val allPropsHidden = specification.streamProperties(MixedIn.INCLUDED)
-                        .map(x -> {
-                            final AuthorizationFacet facet = x.getFacet(AuthorizationFacet.class);
-                            val avc = new PropertyVisibilityContext(vc.getHead(), x.getIdentifier(), vc.getInitiatedBy(), vc.getWhere());
-                            return facet != null && facet.hides(avc) != null;
-                        })
-                        .reduce(true, (prev, next) -> prev && next);
-                if (!allPropsHidden) {
-                    return null;
-                }
-
-                val allCollsHidden = specification.streamCollections(MixedIn.INCLUDED)
-                        .map(x -> {
-                            final AuthorizationFacet facet = x.getFacet(AuthorizationFacet.class);
-                            val avc = new CollectionVisibilityContext(vc.getHead(), x.getIdentifier(), vc.getInitiatedBy(), vc.getWhere());
-                            return facet != null && facet.hides(avc) != null;
-                        })
-                        .reduce(true, (prev, next) -> prev && next);
-                if (!allCollsHidden) {
-                    return null;
-                }
-
-                //noinspection ConstantConditions
-                if (false) {
-                    // not sure that we need to check that all actions
-                    // are hidden before inferring that the type overall is hidden.
-                    val allActsHidden = specification.streamAnyActions(MixedIn.INCLUDED)
-                            .map(x -> {
-                                final AuthorizationFacet facet = x.getFacet(AuthorizationFacet.class);
-                                val avc = new ActionVisibilityContext(vc.getHead(), x, x.getIdentifier(), vc.getInitiatedBy(), vc.getWhere());
-                                return facet != null && facet.hides(avc) != null;
-                            })
-                            .reduce(true, (prev, next) -> prev && next);
-                    if (!allActsHidden) {
-                        return null;
-                    }
-                }
-
-                return "All properties and collections are hidden";
-            default:
+
+        if(!specification.isEntityOrViewModelOrAbstract()) {
+            return null;
+        }
+
+        val hasVisisbleProperty = specification.streamProperties(MixedIn.INCLUDED)
+                .anyMatch(prop ->!AuthorizationFacet.hidesProperty(prop, vc));
+
+        if (hasVisisbleProperty) {
+            return null;
+        }
+
+        val hasVisibleCollection = specification.streamCollections(MixedIn.INCLUDED)
+                .anyMatch(coll ->!AuthorizationFacet.hidesCollection(coll, vc));
+
+        if (hasVisibleCollection) {
+            return null;
+        }
+
+        //noinspection ConstantConditions
+        if (false) {
+            // not sure that we need to check that all actions
+            // are hidden before inferring that the type overall is hidden.
+            val hasVisibleAction = specification.streamRuntimeActions(MixedIn.INCLUDED)
+                    .anyMatch(act ->!AuthorizationFacet.hidesAction(act, vc));
+
+            if (hasVisibleCollection) {
                 return null;
+            }
         }
+
+        return "All properties and collections are hidden";
+
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
index ad19271..22ee2cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
@@ -91,7 +91,7 @@ public abstract class InteractionContext {
     @Getter private final Identifier identifier;
 
     /**
-     * Model that holds the object involved with the interaction.
+     * Model that holds the objects involved with the interaction.
      */
     @Getter private final InteractionHead head;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
index f71a568..78bd2bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
@@ -20,13 +20,66 @@
 package org.apache.isis.core.metamodel.postprocessors.allbutparam.authorization;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.interactions.ActionVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
+import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+
+import lombok.NonNull;
 
 /**
  * Optionally hide or disable an object, property, collection or action
  * depending on the authorization.
  */
-public interface AuthorizationFacet extends Facet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
+public interface AuthorizationFacet
+extends Facet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
+
+    public static boolean hidesProperty(
+            final @NonNull OneToOneAssociation property,
+            final @NonNull VisibilityContext vc) {
+
+        return property.lookupFacet(AuthorizationFacet.class)
+                .map(facet->facet.hides(
+                        new PropertyVisibilityContext(
+                                vc.getHead(),
+                                property.getIdentifier(),
+                                vc.getInitiatedBy(),
+                                vc.getWhere())) != null)
+                .orElse(false);
+    }
+
+    public static boolean hidesCollection(
+            final @NonNull OneToManyAssociation collection,
+            final @NonNull VisibilityContext vc) {
+
+        return collection.lookupFacet(AuthorizationFacet.class)
+                .map(facet->facet.hides(
+                        new CollectionVisibilityContext(
+                                vc.getHead(),
+                                collection.getIdentifier(),
+                                vc.getInitiatedBy(),
+                                vc.getWhere())) != null)
+                .orElse(false);
+    }
+
+    public static boolean hidesAction(
+            final @NonNull ObjectAction action,
+            final @NonNull VisibilityContext vc) {
+
+        return action.lookupFacet(AuthorizationFacet.class)
+                .map(facet->facet.hides(
+                        new ActionVisibilityContext(
+                                vc.getHead(),
+                                action,
+                                action.getIdentifier(),
+                                vc.getInitiatedBy(),
+                                vc.getWhere())) != null)
+                .orElse(false);
+    }
 
 }