public ActivityResult ProcessWorkFlow(FuzeActivity container, FuzeActivity currentActivity, ActivityInput input) { Contracts.ActivityResult activityResult = null; container.CurrentActivityID = currentActivity.ActivityID; // map all input to the activity for activity execution. SetInputMappingsFromWorkFlow(container, currentActivity); // execute the workflow currentActivity.Execute(); // map if the item has any output mappings. SetOutputMappingsToWorkFlow(container, currentActivity); // check the activity type if (currentActivity.ActivityType == "FORM") { // map all output to the activity result. activityResult = new ActivityResult(); activityResult.Results = new Dictionary<string, object>(); // activityResult.Results.Add("FormResult", currentActivity.GetType().GetProperty("ActivityResult").GetValue(currentActivity, null)); MapOutPutMappingToActivityResult(container, currentActivity, activityResult); activityResult.ValidationResults = currentActivity.ValidationErros.ToDictionary(c => c.ValidationKey, x => x.ValidationResult); // check for persistance PersistActivity(container, input); activityResult.WorkflowInstanceID = input.WorkflowInstanceID; if (currentActivity.OutComes == null || currentActivity.OutComes.Count() == 0) { RemoveActivityInstance(input.WorkflowInstanceID); } return activityResult; } else if (currentActivity.ActivityType == "CUSTOM") { if (currentActivity.OutComes == null || currentActivity.OutComes.Count() == 0) { RemoveActivityInstance(input.WorkflowInstanceID); return activityResult; } container.NextActivityID = currentActivity.OutComes.First().Activity.ActivityID; return ProcessWorkFlow(container, currentActivity.OutComes.First().Activity, input); } return activityResult; }