示例#1
0
        private bool CheckLocalReBuildRequired(IClearanceSource clearanceSource)
        {
            if (!ReferenceEquals(_LastClearanceSource, clearanceSource))
            {
                _LocalFilterExpression = null;
                _LastClearanceSource   = clearanceSource;
            }
            var ccDate = _LastClearanceSource.LastClearanceChangeDateUtc;

            if (ccDate > _ClearanceVersionWithinFilterExpression)
            {
                _LocalFilterExpression = null;
                _ClearanceVersionWithinFilterExpression = ccDate;
            }
            if (_LocalFilterExpression != null)
            {
                foreach (Type relatedType in _UpNavigations.Values)
                {
                    if (EntityAccessControl.GetBuilderForEntity(relatedType).CheckLocalReBuildRequired(clearanceSource))
                    {
                        _LocalFilterExpression = null;
                        return(true);
                    }
                }
            }
            return(_LocalFilterExpression == null);
        }
示例#2
0
        public static Expression BuildExpressionIncludingPrincipals(Type entityType, IClearanceSource clearanceSource)
        {
            var genmth = _GenericMethodIncludingPrincipals.MakeGenericMethod(entityType);
            var args   = new object[] { clearanceSource };

            return(genmth.Invoke(null, args) as Expression);
        }
示例#3
0
        public static Expression BuildExpressionForLocalEntity(Type entityType, IClearanceSource clearanceSource)
        {
            var genmth = _GenericMethodLocal.MakeGenericMethod(entityType);
            var args   = new object[] { clearanceSource };

            return(genmth.Invoke(null, args) as Expression);
        }
示例#4
0
        /// <summary>
        /// returns null when nothing to validate
        /// </summary>
        public Expression BuildUntypedLocalFilterExpression(IClearanceSource clearanceSource, Expression entitySourceExpression = null)
        {
            lock (this) {
                if (entitySourceExpression == null)
                {
                    //in default we can use the lamba-entry parameter (which is our entity)
                    entitySourceExpression = _EntityParameter;
                    //we get external expressions, when we are called to build expression for just a part of the graph
                    //in this case a member-expression which navigates from ou child up to us is passed via this arg...
                }

                if (!this.CheckLocalReBuildRequired(clearanceSource))
                {
                    return(_LocalFilterExpression);
                }

                //build expressions for local properties
                foreach (var kvp in _AcDimensionsPerPropertyName)
                {
                    var      propName                 = kvp.Key.Name;
                    var      dimensionName            = kvp.Value;
                    var      propExpr                 = Expression.Property(entitySourceExpression, propName);
                    string[] dimensionClearanceValues = clearanceSource.GetClearancesOfDimension(dimensionName);
                    var      localExpression          = this.BuildAcValueOrExpressionForDimensionClearanceValues(propExpr, kvp.Key.PropertyType, dimensionClearanceValues);
                    if (_LocalFilterExpression == null)
                    {
                        _LocalFilterExpression = localExpression;
                    }
                    else
                    {
                        _LocalFilterExpression = Expression.AndAlso(_LocalFilterExpression, localExpression);
                    }
                }

                //can be null!!!
                return(_LocalFilterExpression);
            }
        }
示例#5
0
        /// <summary>
        /// returns null when nothing to validate
        /// </summary>
        public Expression BuildUntypedFilterExpressionIncludingPrincipals(IClearanceSource clearanceSource, Expression entitySourceExpression = null)
        {
            if (entitySourceExpression == null)
            {
                //in default we can use the lamba-entry parameter (which is our entity)
                entitySourceExpression = _EntityParameter;
                //we get external expressions, when we are called to build expression for just a part of the graph
                //in this case a member-expression which navigates from ou child up to us is passed via this arg...
            }

            Expression result = this.BuildUntypedLocalFilterExpression(clearanceSource, entitySourceExpression);

            foreach (var nav in _UpNavigations)
            {
                String           navPropName      = nav.Key.Name;
                Type             parentEntityType = nav.Value;
                MemberExpression targetEntityNavigationExpression = MemberExpression.Property(entitySourceExpression, navPropName);
                var        builderForParentEntityType             = EntityAccessControl.GetBuilderForEntity(parentEntityType);
                Expression targetFilterExpression = builderForParentEntityType.BuildUntypedFilterExpressionIncludingPrincipals(clearanceSource, targetEntityNavigationExpression);
                //only when the nav has any filtering...
                if (targetFilterExpression != null)
                {
                    if (result == null)
                    {
                        result = targetFilterExpression;
                    }
                    else
                    {
                        result = Expression.AndAlso(result, targetFilterExpression);
                    }
                }
            }

            //can be null!
            return(result);
        }
示例#6
0
 public static Expression <Func <TEntity, bool> > BuildExpressionForLocalEntity <TEntity>(IClearanceSource clearanceSource)
 {
     return(GetBuilderForEntity(typeof(TEntity)).BuildTypedLambdaForLocal <TEntity>(clearanceSource));
 }
示例#7
0
 public static Expression <Func <TEntity, bool> > BuildExpressionIncludingPrincipals <TEntity>(IClearanceSource clearanceSource)
 {
     return(GetBuilderForEntity(typeof(TEntity)).BuildTypedLambdaIncludingPrincipals <TEntity>(clearanceSource));
 }
示例#8
0
        private Expression <Func <TEntity, bool> > BuildTypedLambdaIncludingPrincipals <TEntity>(IClearanceSource clearanceSource, Expression entitySourceExpression = null)
        {
            Expression body = this.BuildUntypedFilterExpressionIncludingPrincipals(clearanceSource);

            if (body == null)
            {
                body = BinaryExpression.Constant(true);
            }
            return(Expression.Lambda <Func <TEntity, bool> >(body, _EntityParameter));
        }