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);
+ }
}