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