private DoArbitrationResult doArbitration_BWAB(Perspective pPerspective) { //_logger.Debug("BWAB調停処理を開始します"); DoArbitrationResult result = new DoArbitrationResult(); foreach (var frameName in pPerspective.FrameList) { bool bPreStartSuccess = false; Content startContent = null; // コンテントを作成 var stack = _FrameList.GetContentStack(frameName); if (stack.Count > 0) { //_logger.Debug("{}フレームの最上位コンテントが存在するためスキップします。", frameName); continue; } startContent = pPerspective.GetFrameContent(frameName); //_logger.Debug("{}フレームに新規コンテントの開始ライフサイクル処理を開始します", frameName); bPreStartSuccess = startContent.Begin(pPerspective); if (bPreStartSuccess) { //_logger.Debug("{}フレームのコンテントスタックに新規コンテントを追加します。", frameName); // 新しいパースペクティブのコンテントをスタックに積む stack.Push(startContent); result.StartContentList.Add(startContent); } else { //_logger.Warn("{}フレームの新規コンテントを追加に失敗しました。ロールバックを行います。", frameName); // TODO: Stackのコンテント(wEndContent)のロールバック } } return(result); }
private DoArbitrationResult doArbitration_INTRCOOR(Perspective pPerspective) { //_logger.Debug("INTRCOOR調停処理を開始します"); DoArbitrationResult result = new DoArbitrationResult(); List <Perspective> clearPerspectiveList = new List <Perspective>(); // クリアするPerspective List <Content> restartContentList = new List <Content>(); // すべてのフレームを巡回し、コンテントをサスペンド状態にする foreach (var frameName in pPerspective.FrameList) { var stack = _FrameList.GetContentStack(frameName); foreach (var content in stack) { if (pPerspective.Contents.Contains(content)) { // 起動しようとしているPerspectiveと同じコンテントが含まれている場合は、 // 終了判定は行わない。 restartContentList.Add(content); } else { bool bEnd = content.Suspend(); if (bEnd) { result.EndContentList.Add(content); } else { // result.EndContentListのすべてのContentをロールバックする } } } } foreach (var frameName in pPerspective.FrameList) { bool bPreStartSuccess = false; Content startContent = null; var stack = _FrameList.GetContentStack(frameName); startContent = pPerspective.GetFrameContent(frameName); //_logger.Debug("{}フレームに新規コンテントの開始ライフサイクル処理を開始します", frameName); bPreStartSuccess = startContent.Begin(pPerspective); if (bPreStartSuccess) { //_logger.Debug("{}フレームのコンテントスタックに新規コンテントを追加します。", frameName); // 新しいパースペクティブのコンテントをスタックに積む stack.Push(startContent); result.StartContentList.Add(startContent); } else { //_logger.Warn("{}フレームの新規コンテントを追加に失敗しました。ロールバックを行います。", frameName); // TODO: Stackのコンテント(wEndContent)のロールバック } } return(result); }
/// <summary> /// 現在の状態にあわせた終了ハンドラを呼び出す。 /// ただし、Resumeは呼び出さない? /// PreXXXの関連を調査する /// </summary> /// <returns>状態の終了に成功した場合はTrueを返す</returns> internal void Forward() { //_logger.Debug("Status={}", Status); if (Status == ContentStatus.Idle) { Status = ContentStatus.Resume; OnResume(); } else if (Status == ContentStatus.Resume) { Status = ContentStatus.Run; OnRun(); } else if (Status == ContentStatus.Run) { StartCompleteFlag = false; Status = ContentStatus.Restart; OnRestart(); Status = ContentStatus.Run; OnRun(); } else if (Status == ContentStatus.PreStop) { StopCompleteFlag = false; Status = ContentStatus.Stop; OnStop(); } else if (Status == ContentStatus.Stop) { if (bProgressStop) { Status = ContentStatus.End; OnEnd(); } else if (bProgressSuspend) { Status = ContentStatus.Suspend; OnSuspend(); } } else if (Status == ContentStatus.End) { bProgressStop = false; bProgressSuspend = false; _Perspective = null; Status = ContentStatus.Idle; OnIdle(); } else if (Status == ContentStatus.Suspend) { Status = ContentStatus.PreResume; OnPreResume(); } else if (Status == ContentStatus.PreResume) { //_logger.Debug("PreResumeのForward処理"); Status = ContentStatus.Resume; OnResume(); } else { throw new ApplicationException("状態が不正です"); } }