public JsonResult GetFormData(int? workFlowID)
        {
            ActivityInput input = new ActivityInput();

            input.WorkflowID = 1;

            var result = service.Invoke(input);

            FuzeFormEngineModel model = new FuzeFormEngineModel();
            model.WorkFlowID = result.WorkflowID;
            model.WorkflowInstanceID = result.WorkflowInstanceID;
            model.FormName = result.Results["ViewName"].ToString();
            model.Model = new { Input1 = "", Input2 = "", Result = "" };

            return Json(model, JsonRequestBehavior.AllowGet);
        }
        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;
        }
        public JsonResult Index(int? workflowID, Guid? workflowInstanceID)
        {
            Stream req = Request.InputStream;
            req.Seek(0, System.IO.SeekOrigin.Begin);
            string json = new StreamReader(req).ReadToEnd();
            ActivityInput input = new ActivityInput();
            input.WorkflowID = workflowID.Value;
            input.WorkflowInstanceID = workflowInstanceID.Value;

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Dictionary<string, object> inputObj = (Dictionary<string, object>)serializer.DeserializeObject(json);
            input.Inputs = inputObj;

            var result = service.Resume(input);

            FuzeFormEngineModel model = new FuzeFormEngineModel();
            model.WorkFlowID = workflowID.Value;
            model.WorkflowInstanceID = workflowInstanceID.Value;
            //model.FormName = result.Results["ViewName"].ToString();
            model.Model = result.Results; //input.Inputs;

            return Json(model, JsonRequestBehavior.AllowGet);
        }
        private void PersistActivity(FuzeActivity container, ActivityInput input)
        {
            bool isUpdate = false;
            if (input.WorkflowInstanceID == Guid.Empty)
            {
                input.WorkflowInstanceID = Guid.NewGuid();
            }
            else
            {
                isUpdate = true;
            }
            StringBuilder instanceXaml = new StringBuilder();
            using (StringWriter writer = new StringWriter(instanceXaml))
            {
                XamlServices.Save(writer, container);
            }

            var workflowInstance = new FuzeWorkflowInstance()
            {
                WorkflowInstanceID = input.WorkflowInstanceID,
                WorkFlow = instanceXaml.ToString()
            };

            if (isUpdate)
            {
                RemoveActivityInstance(workflowInstance.WorkflowInstanceID);
            }

            dbContext.FuzeWorkflowInstances.Add(workflowInstance);
            dbContext.SaveChanges();
        }