예제 #1
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);
        }