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