From 501650cae1d539fbb861b4a2598fdc31939ce5b9 Mon Sep 17 00:00:00 2001 From: Eric Perez Date: Sun, 1 Feb 2015 14:37:49 +0100 Subject: [PATCH] #20651: Fixing duplicate workflow Work Item: 20651 --- .../ImportExport/WorkflowsRecipeHandler.cs | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsRecipeHandler.cs index 92c871fe0..b14f9a37e 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsRecipeHandler.cs @@ -10,9 +10,13 @@ using Orchard.Workflows.Models; namespace Orchard.Workflows.ImportExport { public class WorkflowsRecipeHandler : IRecipeHandler { private readonly IRepository _workflowDefinitionRepository; + private readonly IRepository _activityRepository; + private readonly IRepository _transitionRepository; - public WorkflowsRecipeHandler(IRepository workflowDefinitionRepository) { + public WorkflowsRecipeHandler(IRepository workflowDefinitionRepository, IRepository activityRepository, IRepository transitionRepository) { _workflowDefinitionRepository = workflowDefinitionRepository; + _activityRepository = activityRepository; + _transitionRepository = transitionRepository; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -26,17 +30,13 @@ namespace Orchard.Workflows.ImportExport { } foreach (var workflowDefinitionElement in recipeContext.RecipeStep.Step.Elements()) { - var workflowDefinition = new WorkflowDefinitionRecord { - Name = ProbeWorkflowDefinitionName(workflowDefinitionElement.Attribute("Name").Value), - Enabled = Boolean.Parse(workflowDefinitionElement.Attribute("Enabled").Value) - }; - - _workflowDefinitionRepository.Create(workflowDefinition); - + var workflowDefinition = GetOrCreateWorkflowDefinition(workflowDefinitionElement.Attribute("Name").Value); var activitiesElement = workflowDefinitionElement.Element("Activities"); var transitionsElement = workflowDefinitionElement.Element("Transitions"); var activitiesDictionary = new Dictionary(); + workflowDefinition.Enabled = Boolean.Parse(workflowDefinitionElement.Attribute("Enabled").Value); + foreach (var activityElement in activitiesElement.Elements()) { var localId = Int32.Parse(activityElement.Attribute("Id").Value); var activity = new ActivityRecord { @@ -69,22 +69,32 @@ namespace Orchard.Workflows.ImportExport { recipeContext.Executed = true; } - private string ProbeWorkflowDefinitionName(string name) { - var count = 0; - var newName = name; - WorkflowDefinitionRecord workflowDefinition; + private WorkflowDefinitionRecord GetOrCreateWorkflowDefinition(string name) { + var workflowDefinition = _workflowDefinitionRepository.Get(x => x.Name == name); - do { - var localName = newName; - workflowDefinition = _workflowDefinitionRepository.Get(x => x.Name == localName); + if (workflowDefinition == null) { + workflowDefinition = new WorkflowDefinitionRecord { + Name = name + }; + _workflowDefinitionRepository.Create(workflowDefinition); + } + else { + CleanWorkFlow(workflowDefinition); + } - if (workflowDefinition != null) { - newName = string.Format("{0}-{1}", name, ++count); - } + return workflowDefinition; + } - } while (workflowDefinition != null); + private void CleanWorkFlow(WorkflowDefinitionRecord workflowDefinition) { + foreach (var activityRecord in workflowDefinition.ActivityRecords) { + _activityRepository.Delete(activityRecord); + } + workflowDefinition.ActivityRecords.Clear(); - return newName; + foreach (var transitionRecord in workflowDefinition.TransitionRecords) { + _transitionRepository.Delete(transitionRecord); + } + workflowDefinition.TransitionRecords.Clear(); } } }