Esempio n. 1
0
        /// <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;
        }