/// <summary> /// 後勝調停モード /// </summary> private DoArbitrationResult doArbitration_AWAB(Perspective pPerspective) { //_logger.Debug("AWAB調停処理を開始します"); DoArbitrationResult result = new DoArbitrationResult(); WorkflowManagerContext context = new WorkflowManagerContext(); foreach (var frameName in pPerspective.FrameList) { bool bPreEndSuccess = true; bool bPreStartSuccess = false; Content wEndContent = null; Content startContent = pPerspective.GetFrameContent(frameName); var stack = _FrameList.GetContentStack(frameName); if (stack.Count > 0) { //_logger.Debug("{}フレームの最上位コンテントの終了ライフサイクル処理を開始します", frameName); wEndContent = stack.Peek(); if (wEndContent != startContent) { bPreEndSuccess = wEndContent.Stop(); } } if (bPreEndSuccess) { startContent = pPerspective.GetFrameContent(frameName); //_logger.Debug("{}フレームに新規コンテントの開始ライフサイクル処理を開始します", frameName); bPreStartSuccess = startContent.Begin(pPerspective); if (bPreStartSuccess) { if (stack.Count > 0) { wEndContent = stack.Pop(); // スタックから除去する //_logger.Debug("{}フレームのコンテントスタックから除去します", frameName); result.EndContentList.Add(wEndContent); } //_logger.Debug("{}フレームのコンテントスタックに新規コンテントを追加します。", frameName); // 新しいパースペクティブのコンテントをスタックに積む stack.Push(startContent); result.StartContentList.Add(startContent); } else { //_logger.Warn("{}フレームの新規コンテントを追加に失敗しました。ロールバックを行います。", frameName); // TODO: Stackのコンテント(wEndContent)のロールバック } } else { //_logger.Warn("{}フレームの最上位コンテントの終了ライフサイクル処理に失敗しました", frameName); } } return(result); }
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> /// パースペクティブを開始する /// </summary> /// <param name="PerspectiveName">開始するパースペクティブ名</param> public void StartPerspective(string PerspectiveName) { if (!_VerifiedFlag) { throw new ApplicationException("初期化が完了していません"); } if (_PerspectiveProcessingStartFlag) { throw new ApplicationException("パースペクティブ起動中です"); } _PerspectiveProcessingStartFlag = true; var target = FindPerspective(PerspectiveName); if (target == null) { throw new ApplicationException("存在しないパースペクティブ名です"); } // 1. パースペクティブの調停 DoArbitrationResult result = null; switch (target.Mode) { case ArbitrationMode.AWAB: result = doArbitration_AWAB(target); break; case ArbitrationMode.BWAB: result = doArbitration_BWAB(target); break; case ArbitrationMode.OVERRIDE: result = doArbitration_OVERRIDE(target); break; case ArbitrationMode.INTRCOMP: result = doArbitration_INTRCOMP(target); break; case ArbitrationMode.INTRCOOR: result = doArbitration_INTRCOOR(target); break; default: throw new ApplicationException("未サポート"); } if (result.EndContentList.Count == 0) { //_logger.Debug("終了するコンテントがないため、新しいコンテントを起動します"); foreach (var content in result.StartContentList) { content.Forward(); } } else { foreach (var content in result.EndContentList) { content.Forward(); } } }