private static bool ValidateDUInConditionTransition(NativeActivityUpdateMapMetadata metadata, InternalTransition updatedTransition, InternalTransition originalTransition, out string errorMessage) { Fx.Assert(!originalTransition.IsUnconditional, "Transition should be conditional in the original definition."); errorMessage = string.Empty; foreach (TransitionData updatedTData in updatedTransition.TransitionDataList) { if (metadata.IsReferenceToImportedChild(updatedTData.Condition)) { // if the trigger is referenced, it might have another save values already. errorMessage = SR.TriggerOrConditionIsReferenced; return(false); } Fx.Assert(null != updatedTData.Condition, "Must be a condition transition."); Activity conditionMatch = metadata.GetMatch(updatedTData.Condition); if (null == conditionMatch && null != metadata.GetMatch(updatedTData.Action)) { // new Transition.Condition with an Transition.Action moved from within the InternalState. errorMessage = SR.MovingActivitiesInStateBlockDU; return(false); } else if (null != conditionMatch) { bool foundMatchingOriginalCondition = false; for (int transitionIndex = 0; transitionIndex < originalTransition.TransitionDataList.Count; transitionIndex++) { if (object.ReferenceEquals(originalTransition.TransitionDataList[transitionIndex].Condition, conditionMatch)) { foundMatchingOriginalCondition = true; // found the original matching condition in updated transition definition. TransitionData originalTData = originalTransition.TransitionDataList[transitionIndex]; Activity originalAction = originalTData.Action; // NOTE: Transition.Action is allowed to be removed, because it doesn't change the execution semantics of SM // if this removed activity was executing, WF runtime would disallow the update. Activity actionMatch = metadata.GetMatch(updatedTData.Action); if (null != actionMatch && !object.ReferenceEquals(originalAction, actionMatch)) { // Transition.Action is an activity moved from elsewhere within the InternalState errorMessage = SR.MovingActivitiesInStateBlockDU; return(false); } metadata.SaveOriginalValue(updatedTransition.Trigger, originalTransition.InternalTransitionIndex); metadata.SaveOriginalValue(updatedTData.Condition, transitionIndex); } } if (!foundMatchingOriginalCondition) { // another child activity is move to the Transition.Condition. errorMessage = SR.DUDisallowIfCannotFindingMatchingCondition; return(false); } } } return(true); }