예제 #1
0
        public ExecutionResult ValidateCommand(object commandMessage, ICommandConfiguration commandConfiguration)
        {
            var totalResult = new ExecutionResult();

            IEnumerable<ValidationRuleInstance> ruleInstances = commandConfiguration.GetValidationRules();

            foreach (ValidationRuleInstance instance in ruleInstances)
            {
                if (instance.ShouldApply != null)
                    if (!(bool) instance.ShouldApply.DynamicInvoke(commandMessage))
                        continue;

                Delegate compile = instance.ToCheckExpression.Compile();
                object input = compile.DynamicInvoke(new object[] {commandMessage});
                bool stopProcessing = false;

                if (instance.ArrayRule)
                {
                    var enumerable = (IEnumerable) input;

                    int i = 0;

                    foreach (object item in enumerable)
                    {
                        if (item == null) continue;

                        IValidationRule rule = _ruleFactory.ConstructRule(instance);
                        string result = rule.IsValid(item);

                        bool ruleFailed = result != null;

                        if (ruleFailed)
                        {
                            var indexedUiExpression = new IndexReplacerVisitor(i).Visit(instance.UIAttributeExpression);
                            totalResult.AddMessage(result, instance.ToCheckExpression, (LambdaExpression)indexedUiExpression, instance.ToCompareExpression);

                            if (rule.StopProcessing)
                            {
                                stopProcessing = true;
                                break;
                            }
                        }
                        i++;
                    }
                }
                else
                {
                    IValidationRule rule = _ruleFactory.ConstructRule(instance);

                    if (rule is ICrossReferencedValidationRule)
                    {
                        Delegate toCompareDelegate = instance.ToCompareExpression.Compile();
                        object toCompare = toCompareDelegate.DynamicInvoke(new object[] {commandMessage});
                        ((ICrossReferencedValidationRule) rule).ToCompare = toCompare;
                    }

                    string result = rule.IsValid(input);

                    bool ruleFailed = result != null;

                    if (ruleFailed)
                    {
                        totalResult.AddMessage(result, instance.ToCheckExpression, instance.UIAttributeExpression, instance.ToCompareExpression);

                        if (rule.StopProcessing)
                        {
                            break;
                        }
                    }
                }
                if (stopProcessing)
                    break;
            }

            return totalResult;
        }
예제 #2
0
        ///-------------------------------------------------------------------------------------------------
        /// <summary>
        ///  Processes the command.
        /// </summary>
        /// <exception cref="Exception">
        ///  Thrown when an exception error condition occurs.
        /// </exception>
        /// <exception cref="SessionException">
        ///  Thrown when a Session error condition occurs.
        /// </exception>
        /// <param name="commands">
        ///  A variable-length parameters list containing command.
        /// </param>
        /// <returns>
        ///  An IExecutionResult.
        /// </returns>
        ///-------------------------------------------------------------------------------------------------
        public ISessionResult Execute(params IDomainCommand[] commands)
        {
            if (commands == null || commands.Length == 0)
            {
                return(ExecutionResult.Empty);
            }

            var domainCommands = commands.Where(cmd => cmd != null).ToList();

            if (domainCommands.Count == 0)
            {
                return(ExecutionResult.Empty);
            }

            var result            = new ExecutionResult();
            var commandsByDomains = from cmd in domainCommands group cmd by cmd.DomainModel.Name;

            ((ISessionInternal)this).PushExecutionScope();

            try
            {
                foreach (var cd in commandsByDomains)
                {
                    var dm = Store.GetDomainModel(cd.Key);
                    if (dm == null)
                    {
                        dm = Store.GetSchema(cd.Key);
                    }
                    if (dm == null)
                    {
                        throw new DomainNotFoundException(cd.Key);
                    }

                    if (dm is IUpdatableDomainModel)
                    {
                        var messages = ((IUpdatableDomainModel)dm).Commands.ProcessCommands(cd.ToArray());
                        result.AddMessages(messages);
                    }
                }
            }
            catch (SessionException)
            {
                // On force le rollback sur la session car l'appel courant a pu être intègré dans une session
                // englobante
                ((ISessionInternal)this).RejectChanges();
            }
            catch (Exception ex) // Si bug ds Hyperstore ;-)
            {
                result.AddMessage(new DiagnosticMessage(MessageType.Error, "Command aborted", "Fatal error", ex: ex));
                // On force le rollback sur la session car l'appel courant a pu être intègré dans une session
                // englobante
                ((ISessionInternal)this).RejectChanges();
            }
            finally
            {
                ((ISessionInternal)this).PopExecutionScope();
                // Sinon si on est dans une session englobante, il faut générer directement l'exception.
                if (result.ShouldRaiseException() && (((ISessionInternal)this).Mode & SessionMode.SilentMode) != SessionMode.SilentMode)
                {
                    throw new SessionException(result.Messages);
                }
            }
            return(result);
        }
        public ExecutionResult ValidateCommand(object commandMessage, ICommandConfiguration commandConfiguration)
        {
            var totalResult = new ExecutionResult();

            IEnumerable <ValidationRuleInstance> ruleInstances = commandConfiguration.GetValidationRules();

            foreach (ValidationRuleInstance instance in ruleInstances)
            {
                if (instance.ShouldApply != null)
                {
                    if (!(bool)instance.ShouldApply.DynamicInvoke(commandMessage))
                    {
                        continue;
                    }
                }

                Delegate compile        = instance.ToCheckExpression.Compile();
                object   input          = compile.DynamicInvoke(new object[] { commandMessage });
                bool     stopProcessing = false;

                if (instance.ArrayRule)
                {
                    var enumerable = (IEnumerable)input;

                    int i = 0;

                    foreach (object item in enumerable)
                    {
                        if (item == null)
                        {
                            continue;
                        }

                        IValidationRule rule   = _ruleFactory.ConstructRule(instance);
                        string          result = rule.IsValid(item);

                        bool ruleFailed = result != null;

                        if (ruleFailed)
                        {
                            var indexedUiExpression = new IndexReplacerVisitor(i).Visit(instance.UIAttributeExpression);
                            totalResult.AddMessage(result, instance.ToCheckExpression, (LambdaExpression)indexedUiExpression, instance.ToCompareExpression);

                            if (rule.StopProcessing)
                            {
                                stopProcessing = true;
                                break;
                            }
                        }
                        i++;
                    }
                }
                else
                {
                    IValidationRule rule = _ruleFactory.ConstructRule(instance);

                    if (rule is ICrossReferencedValidationRule)
                    {
                        Delegate toCompareDelegate = instance.ToCompareExpression.Compile();
                        object   toCompare         = toCompareDelegate.DynamicInvoke(new object[] { commandMessage });
                        ((ICrossReferencedValidationRule)rule).ToCompare = toCompare;
                    }

                    string result = rule.IsValid(input);

                    bool ruleFailed = result != null;

                    if (ruleFailed)
                    {
                        totalResult.AddMessage(result, instance.ToCheckExpression, instance.UIAttributeExpression, instance.ToCompareExpression);

                        if (rule.StopProcessing)
                        {
                            break;
                        }
                    }
                }
                if (stopProcessing)
                {
                    break;
                }
            }

            return(totalResult);
        }