예제 #1
0
        public IDecorationCommandImplementation Get(IProcessCommand command)
        {
            if (command is IRunCommand)
                return new RunCommand(command as IRunCommand);

            throw new ArgumentException();
        }
예제 #2
0
 public CommandResultProcessor NotifyProcessCommandSendFailed(IProcessCommand command)
 {
     TaskCompletionSource<ProcessResult> taskCompletionSource;
     if (_processTaskDict.TryGetValue(command.ProcessId, out taskCompletionSource))
     {
         taskCompletionSource.TrySetResult(new ProcessResult(command.ProcessId, 0, "Start process command send failed."));
     }
     return this;
 }
예제 #3
0
 /// <summary>
 /// 指定されたコマンドを実行します。
 /// </summary>
 /// <param name="command">コマンド</param>
 /// <param name="prevExitCode">前処理の終了コード</param>
 /// <returns></returns>
 protected async Task <int> ExecuteCommandAsync(IProcessCommand command, int prevExitCode)
 {
     try
     {
         await foreach (string item in command.StartAsync(prevExitCode))
         {
             Console.WriteLine($"[{command.Name}] {item}");
         }
         return(0);
     }
     catch (ProcessErrorException ex)
     {
         Console.WriteLine(ex.Message);
         return(ex.ExitCode);
     }
 }
예제 #4
0
        public async Task SetCommand(IProcessCommand command)
        {
            logger.Log("Process " + Id + " sending property command for " +
                       command.GetKey() + ":" + command.GetShortStatus());

            IComputer remote;
            Task      computerInterrupt;

            lock (this)
            {
                // use a lock to ensure memory safety since these are set on another thread
                remote            = computer;
                computerInterrupt = computerCancellation;
            }

            Task interrupt = Task.WhenAny(computerInterrupt, AsyncCancelTask);

            StringBuilder sb = new StringBuilder(directory);

            sb.AppendFormat("?op=setstatus");
            sb.AppendFormat("&key={0}", command.GetKey());
            sb.AppendFormat("&shortstatus={0}", command.GetShortStatus());
            sb.AppendFormat("&notifywaiters=true");

            Task <string> bail      = interrupt.ContinueWith((t) => "");
            Task <string> upload    = PostRequest(remote, sb.ToString(), command.GetPayload());
            Task <string> completed = await Task.WhenAny(bail, upload);

            if (completed == bail)
            {
                logger.Log("Process " + Id + " abandoned property command due to interrupt");
                return;
            }

            if (completed.Result == null)
            {
                logger.Log("Process " + Id + " send property command succeeded");

                command.OnCompleted(null);
            }
            else
            {
                // if this failed, there's nothing much more we can do
                logger.Log("Process " + Id + " got command send failure " + completed.Result);
                command.OnCompleted(completed.Result);
            }
        }
예제 #5
0
        public IDecorationCommandImplementation Get(IProcessCommand command)
        {
            if (command is IRunCommand)
            {
                return(new RunCommand(command as IRunCommand));
            }
            if (command is IKillCommand)
            {
                return(new KillCommand(command as IKillCommand));
            }
            if (command is IWaitCommand)
            {
                return(new WaitCommand(command as IWaitCommand));
            }

            throw new ArgumentException();
        }
예제 #6
0
        /// <summary>
        /// 处理操作
        /// </summary>
        /// <param name="request">请求参数</param>
        /// <param name="ctx">上下文参数</param>
        /// <returns>返回处理结果</returns>
        public virtual INGPResponse HandleProcess(INGPRequest request, TContext ctx)
        {
            INGPResponse result = null;

            do
            {
                // 当前执行结果
                result = Process(request, ctx);

                IProcessCommand <TContext> step = null;
                if (!_steps.TryDequeue(out step) || step == null)
                {
                    break;
                }

                var nextRequest = result as INGPRequest;
                step.HandleProcess(nextRequest, ctx);
            }while (_steps.Count > 0);

            return(result);
        }
예제 #7
0
        public override async Task Execute()
        {
            IProcessCommand processor = null;

            if (IsImage())
            {
                processor = new ProcessImage
                {
                    Source      = Source, CurrentUser = CurrentUser, LoadType = "File Upload", CloudHandler = CloudHandler,
                    DataHandler = DataHandler
                };
            }

            else if (IsVideo())
            {
            }

            else if (IsDocument())
            {
            }

            if (processor != null)
            {
                await LogicHandler.Execute(processor);

                if (processor.Result != null && processor.Result.Success)
                {
                    Model  = processor.Result.Value as VisibleFile;
                    Result = processor.Result;
                }
                else
                {
                    Result = ActionConfirm.CreateFailure("File " + Source.FileName + " -> failed to load");
                }
            }
            else
            {
                Result = ActionConfirm.CreateFailure("File " + Source.FileName + " -> type not supported");
            }
        }
예제 #8
0
 public ProcessSubcommand(IProcessCommand adapted_command)
     : base(adapted_command)
 {
     this.adapted_command = adapted_command;
 }
예제 #9
0
 public ProcessSubcommand()
 {
     adapted_command = new ProcessCommandAdapter(this);
 }
예제 #10
0
        public Task<ProcessResult> StartProcess(IProcessCommand command)
        {
            var message = BuildCommandMessage(command);
            var taskCompletionSource = new TaskCompletionSource<ProcessResult>();

            _commandResultProcessor.RegisterProcess(command, taskCompletionSource);

            _producer.SendAsync(message, command.AggregateRootId).ContinueWith(sendTask =>
            {
                if (sendTask.Result.SendStatus == SendStatus.Failed)
                {
                    _commandResultProcessor.NotifyProcessCommandSendFailed(command);
                }
            });

            return taskCompletionSource.Task;
        }
예제 #11
0
 /// <summary>
 /// インスタンスを生成します。
 /// </summary>
 /// <param name="command">コマンド</param>
 /// <param name="exitCode">終了コード</param>
 public ProcessCommandResult(IProcessCommand command, int exitCode)
 {
     Command  = command;
     ExitCode = exitCode;
 }
예제 #12
0
        public void SetProcessCommand(IProcess ip, IProcessCommand command)
        {
            Process process = ip as Process;

            Task.Run(() => process.SetCommand(command));
        }
예제 #13
0
 /// <summary>
 /// 添加下一步骤
 /// </summary>
 /// <param name="step">下一步骤</param>
 public void AddNextStep(IProcessCommand <TContext> step)
 {
     // 添加元素
     _steps.Enqueue(step);
 }
예제 #14
0
 /// <summary>
 /// インスタンスを生成します。
 /// </summary>
 /// <param name="id">ID</param>
 /// <param name="name">名称</param>
 /// <param name="command">コマンド</param>
 public WorkflowItem(string id, string name, IProcessCommand command) : base(id, name)
 {
     Command = command;
 }
 public Task<ProcessResult> StartProcess(IProcessCommand command)
 {
     throw new NotImplementedException();
 }
예제 #16
0
        public async Task SetCommand(IProcessCommand command)
        {
            logger.Log("Process " + Id + " sending property command for " +
                command.GetKey() + ":" + command.GetShortStatus());

            IComputer remote;
            Task computerInterrupt;
            lock (this)
            {
                // use a lock to ensure memory safety since these are set on another thread
                remote = computer;
                computerInterrupt = computerCancellation;
            }

            Task interrupt = Task.WhenAny(computerInterrupt, AsyncCancelTask);

            StringBuilder sb = new StringBuilder(directory);
            sb.AppendFormat("?op=setstatus");
            sb.AppendFormat("&key={0}", command.GetKey());
            sb.AppendFormat("&shortstatus={0}", command.GetShortStatus());
            sb.AppendFormat("&notifywaiters=true");

            Task<string> bail = interrupt.ContinueWith((t) => "");
            Task<string> upload = PostRequest(remote, sb.ToString(), command.GetPayload());
            Task<string> completed = await Task.WhenAny(bail, upload);

            if (completed == bail)
            {
                logger.Log("Process " + Id + " abandoned property command due to interrupt");
                return;
            }

            if (completed.Result == null)
            {
                logger.Log("Process " + Id + " send property command succeeded");

                command.OnCompleted(null);
            }
            else
            {
                // if this failed, there's nothing much more we can do
                logger.Log("Process " + Id + " got command send failure " + completed.Result);
                command.OnCompleted(completed.Result);
            }
        }
예제 #17
0
 public void SetProcessCommand(IProcess ip, IProcessCommand command)
 {
     Process process = ip as Process;
     Task.Run(() => process.SetCommand(command));
 }
예제 #18
0
 public NESEngine(IProcessCommand commandProcessor, IOManager consoleManager, IPrinterManager printerManager)
 {
     CommandProcessor = commandProcessor;
     ConsoleManager   = consoleManager;
     PrinterManager   = printerManager;
 }
예제 #19
0
 public CommandResultProcessor RegisterProcess(IProcessCommand command, TaskCompletionSource<ProcessResult> taskCompletionSource)
 {
     _processTaskDict.TryAdd(command.ProcessId, taskCompletionSource);
     return this;
 }