/// <summary> /// The main method of WorkflowUploader. Upload the given workflow and its dependencies to server using the default WorkflowsQueryService, as a new activityLibrary. /// </summary>; /// <param name="workflow">WorkflowItem to save</param> /// <returns>true if uploaded succeeded, else CommunicationException</returns> /// <exception cref="CommunicationException">WCF layer exceptions and error codes from the workflow query service will be wrapped as CommunicationExceptions</exception> public static StatusReplyDC Upload(IWorkflowsQueryService proxy, WorkflowItem workflow) { var assemblyActivitiyItemsUsed = workflow.WorkflowDesigner.DependencyAssemblies; // Database requires that we upload dependencies first so the DB is always in a consistent state Upload(proxy, assemblyActivitiyItemsUsed); // Now, upload the actual workflow StoreActivitiesDC result = null; if (workflow.TaskActivityGuid.HasValue) { result = proxy.UploadActivityLibraryAndTaskActivities( DataContractTranslator.WorkflowToStoreLibraryAndTaskActivityRequestDC(workflow, assemblyActivitiyItemsUsed) )[0].Activity; } else { List<TaskAssignment> tasks = workflow.WorkflowDesigner.Tasks; Guid[] newTaskIds = tasks.Where(t => t.TaskStatus == TaskActivityStatus.New).Select(t => t.TaskId).ToArray(); if (newTaskIds.Any()) { workflow.WorkflowDesigner.SetNewTasksToAssigned(newTaskIds); workflow.SetXamlCode(); // Publication has removed all tasks from workflow } try { result = proxy.UploadActivityLibraryAndDependentActivities( DataContractTranslator.WorkflowToStoreLibraryAndActivitiesRequestDC(workflow, assemblyActivitiyItemsUsed, tasks) )[0]; } catch (Exception) { if (newTaskIds.Any()) workflow.WorkflowDesigner.RollbackAssignedTasks(newTaskIds); } } result.StatusReply.CheckErrors(); // No exception = success. Disable the Save button, clean up, return true to report success. workflow.FinishTaskAssigned(); workflow.CreateDateTime = result.InsertedDateTime; workflow.UpdateDateTime = result.UpdatedDateTime; workflow.Version = result.Version; workflow.IsOpenFromServer = true; workflow.IsSavedToServer = true; workflow.IsDataDirty = false; return result.StatusReply; }