Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        /// <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();
                }
            }
        }