Esempio n. 1
0
        public void Activate(Token targetToken)
        {
            Lifeline target;

            if (!TryGetLifeline(targetToken, out target))
            {
                return;
            }

            Row startRow = m_Matrix.LastRow;
            Pin startPin = startRow[target];

            if (startPin.PinType != PinType.In)
            {
                AddError(targetToken, "Unexpected activation. Add call [ANY]->[THIS] before activation.");
                return;
            }

            var endPin = new OpenPin(target, startPin.Orientation, targetToken);

            target.State.OpenPins.Push(endPin);
            int      currentLevel = target.State.GetLevel(startPin.Orientation);
            Activity activity     = ElementFactory.CreateActivity(currentLevel);

            target.State.IncLevel(startPin.Orientation);
            activity.Connect(startPin, endPin);
            CurrentOperand().Add(activity);
        }
Esempio n. 2
0
        private void Deactivate(Lifeline target, Token targetToken, bool errorIfUnexpectedDeactivation)
        {
            Row endRow = m_Matrix.LastRow;
            Pin endPin = endRow[target];

            if (target.State.OpenPins.Count == 0)
            {
                AddError(targetToken, "Unexpected deactivation. The lifeline must be activated before.");
                return;
            }

            OpenPin  lastOpenPin      = target.State.OpenPins.Pop();
            Activity lastOpenActivity = lastOpenPin.GetActivity();

            if (endPin.PinType != PinType.In && endPin.Signal != null && endPin.Signal.SignalType == SignalType.Return)
            {
                ILifeline targetOfReturn     = endPin.Signal.End.Lifeline;
                ILifeline sourceOfActivation = lastOpenActivity.Start.Signal.Start.Lifeline;

                if (!sourceOfActivation.Equals(targetOfReturn))
                {
                    AddError(targetToken,
                             string.Format(
                                 "Unexpected deactivation. Return came from '{0}' but activation was initiated by '{1}'",
                                 targetOfReturn.Id,
                                 sourceOfActivation.Id));
                }
            }
            else
            {
                endRow = m_Matrix.CreateRow();
                endPin = endRow[target];
            }

            lastOpenActivity.ReconnectEnd(endPin);
            target.State.DecLevel(lastOpenActivity.Orientation);
        }