#20651: Fixing duplicate workflow

Work Item: 20651
This commit is contained in:
Eric Perez
2015-02-01 14:37:49 +01:00
committed by agriffard
parent deba3b2756
commit 501650cae1

View File

@@ -10,9 +10,13 @@ using Orchard.Workflows.Models;
namespace Orchard.Workflows.ImportExport {
public class WorkflowsRecipeHandler : IRecipeHandler {
private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRepository;
private readonly IRepository<ActivityRecord> _activityRepository;
private readonly IRepository<TransitionRecord> _transitionRepository;
public WorkflowsRecipeHandler(IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository) {
public WorkflowsRecipeHandler(IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository, IRepository<ActivityRecord> activityRepository, IRepository<TransitionRecord> 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<int, ActivityRecord>();
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();
}
}
}