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); }
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); }