Refactored Workflows import/export step.

This commit is contained in:
Sipke Schoorstra
2015-07-17 14:47:31 +01:00
parent aa91768bf1
commit de37e29610
4 changed files with 158 additions and 179 deletions

View File

@@ -1,14 +0,0 @@
using System.Collections.Generic;
using Orchard.Events;
namespace Orchard.Workflows.ImportExport {
public interface ICustomExportStep : IEventHandler {
void Register(IList<string> steps);
}
public class WorkflowsCustomExportStep : ICustomExportStep {
public void Register(IList<string> steps) {
steps.Add("Workflows");
}
}
}

View File

@@ -154,9 +154,8 @@
<Compile Include="Forms\WebRequestForm.cs" /> <Compile Include="Forms\WebRequestForm.cs" />
<Compile Include="Handlers\WorkflowContentHandler.cs" /> <Compile Include="Handlers\WorkflowContentHandler.cs" />
<Compile Include="Handlers\WorkflowHandler.cs" /> <Compile Include="Handlers\WorkflowHandler.cs" />
<Compile Include="ImportExport\WorkflowsCustomExportStep.cs" /> <Compile Include="Recipes\Builders\WorkflowsStep.cs" />
<Compile Include="ImportExport\WorkflowsExportEventHandler.cs" /> <Compile Include="Recipes\Executors\WorkflowsStep.cs" />
<Compile Include="ImportExport\WorkflowsRecipeHandler.cs" />
<Compile Include="Models\AwaitingActivityRecord.cs" /> <Compile Include="Models\AwaitingActivityRecord.cs" />
<Compile Include="Models\CancellationToken.cs" /> <Compile Include="Models\CancellationToken.cs" />
<Compile Include="Models\ActivityContext.cs" /> <Compile Include="Models\ActivityContext.cs" />

View File

@@ -1,62 +1,61 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Xml.Linq; using System.Xml.Linq;
using Orchard.Data; using Orchard.Data;
using Orchard.Events; using Orchard.Localization;
using Orchard.Workflows.Models; using Orchard.Recipes.Services;
using Orchard.Workflows.Models;
namespace Orchard.Workflows.ImportExport {
public interface IExportEventHandler : IEventHandler { namespace Orchard.Workflows.Recipes.Builders {
void Exporting(dynamic context); public class WorkflowsStep : RecipeBuilderStep {
void Exported(dynamic context); private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRepository;
}
public WorkflowsStep(IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository) {
public class WorkflowsExportEventHandler : IExportEventHandler { _workflowDefinitionRepository = workflowDefinitionRepository;
private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRepository; }
public WorkflowsExportEventHandler(IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository) { public override string Name {
_workflowDefinitionRepository = workflowDefinitionRepository; get { return "Workflows"; }
} }
public void Exporting(dynamic context) { public override LocalizedString DisplayName {
} get { return T("Workflows"); }
}
public void Exported(dynamic context) {
public override LocalizedString Description {
if (!((IEnumerable<string>)context.ExportOptions.CustomSteps).Contains("Workflows")) { get { return T("Exports workflow definitions."); }
return; }
}
public override void Build(BuildContext context) {
var workflowDefinitions = _workflowDefinitionRepository.Table.ToList(); var workflowDefinitions = _workflowDefinitionRepository.Table.ToList();
if (!workflowDefinitions.Any()) { if (!workflowDefinitions.Any()) {
return; return;
} }
var root = new XElement("Workflows"); var root = new XElement("Workflows");
context.Document.Element("Orchard").Add(root); context.RecipeDocument.Element("Orchard").Add(root);
foreach (var workflowDefinition in workflowDefinitions.OrderBy(x => x.Name)) { foreach (var workflowDefinition in workflowDefinitions.OrderBy(x => x.Name)) {
root.Add(new XElement("Workflow", root.Add(new XElement("Workflow",
new XAttribute("Name", workflowDefinition.Name), new XAttribute("Name", workflowDefinition.Name),
new XAttribute("Enabled", workflowDefinition.Enabled), new XAttribute("Enabled", workflowDefinition.Enabled),
new XElement("Activities", workflowDefinition.ActivityRecords.Select(activity => new XElement("Activities", workflowDefinition.ActivityRecords.Select(activity =>
new XElement("Activity", new XElement("Activity",
new XAttribute("Id", activity.Id), new XAttribute("Id", activity.Id),
new XAttribute("Name", activity.Name), new XAttribute("Name", activity.Name),
new XAttribute("Start", activity.Start), new XAttribute("Start", activity.Start),
new XAttribute("X", activity.X), new XAttribute("X", activity.X),
new XAttribute("Y", activity.Y), new XAttribute("Y", activity.Y),
new XElement("State", activity.State)))), new XElement("State", activity.State)))),
new XElement("Transitions", workflowDefinition.TransitionRecords.Select(transition => new XElement("Transitions", workflowDefinition.TransitionRecords.Select(transition =>
new XElement("Transition", new XElement("Transition",
new XAttribute("SourceActivityId", transition.SourceActivityRecord.Id), new XAttribute("SourceActivityId", transition.SourceActivityRecord.Id),
new XAttribute("SourceEndpoint", transition.SourceEndpoint ?? ""), new XAttribute("SourceEndpoint", transition.SourceEndpoint ?? ""),
new XAttribute("DestinationActivityId", transition.DestinationActivityRecord.Id), new XAttribute("DestinationActivityId", transition.DestinationActivityRecord.Id),
new XAttribute("DestinationEndpoint", transition.DestinationEndpoint ?? "")))))); new XAttribute("DestinationEndpoint", transition.DestinationEndpoint ?? ""))))));
} }
}
} }
} }
}

View File

@@ -1,100 +1,95 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Orchard.Data; using Orchard.Data;
using Orchard.Localization; using Orchard.Recipes.Models;
using Orchard.Logging; using Orchard.Recipes.Services;
using Orchard.Recipes.Models; using Orchard.Workflows.Models;
using Orchard.Recipes.Services;
using Orchard.Workflows.Models; namespace Orchard.Workflows.Recipes.Executors {
public class WorkflowsStep : RecipeExecutionStep {
namespace Orchard.Workflows.ImportExport { private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRepository;
public class WorkflowsRecipeHandler : IRecipeHandler { private readonly IRepository<ActivityRecord> _activityRepository;
private readonly IRepository<WorkflowDefinitionRecord> _workflowDefinitionRepository; private readonly IRepository<TransitionRecord> _transitionRepository;
private readonly IRepository<ActivityRecord> _activityRepository;
private readonly IRepository<TransitionRecord> _transitionRepository; public WorkflowsStep(
IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository,
public WorkflowsRecipeHandler(IRepository<WorkflowDefinitionRecord> workflowDefinitionRepository, IRepository<ActivityRecord> activityRepository, IRepository<TransitionRecord> transitionRepository) { IRepository<ActivityRecord> activityRepository,
_workflowDefinitionRepository = workflowDefinitionRepository; IRepository<TransitionRecord> transitionRepository) {
_activityRepository = activityRepository;
_transitionRepository = transitionRepository; _workflowDefinitionRepository = workflowDefinitionRepository;
Logger = NullLogger.Instance; _activityRepository = activityRepository;
T = NullLocalizer.Instance; _transitionRepository = transitionRepository;
} }
public Localizer T { get; set; } public override string Name {
public ILogger Logger { get; set; } get { return "Workflows"; }
}
public void ExecuteRecipeStep(RecipeContext recipeContext) {
if (!String.Equals(recipeContext.RecipeStep.Name, "Workflows", StringComparison.OrdinalIgnoreCase)) { public override void Execute(RecipeExecutionContext context) {
return; foreach (var workflowDefinitionElement in context.RecipeStep.Step.Elements()) {
} var workflowDefinition = GetOrCreateWorkflowDefinition(workflowDefinitionElement.Attribute("Name").Value);
var activitiesElement = workflowDefinitionElement.Element("Activities");
foreach (var workflowDefinitionElement in recipeContext.RecipeStep.Step.Elements()) { var transitionsElement = workflowDefinitionElement.Element("Transitions");
var workflowDefinition = GetOrCreateWorkflowDefinition(workflowDefinitionElement.Attribute("Name").Value); var activitiesDictionary = new Dictionary<int, ActivityRecord>();
var activitiesElement = workflowDefinitionElement.Element("Activities");
var transitionsElement = workflowDefinitionElement.Element("Transitions"); workflowDefinition.Enabled = Boolean.Parse(workflowDefinitionElement.Attribute("Enabled").Value);
var activitiesDictionary = new Dictionary<int, ActivityRecord>();
foreach (var activityElement in activitiesElement.Elements()) {
workflowDefinition.Enabled = Boolean.Parse(workflowDefinitionElement.Attribute("Enabled").Value); var localId = Int32.Parse(activityElement.Attribute("Id").Value);
var activity = new ActivityRecord {
foreach (var activityElement in activitiesElement.Elements()) { Name = activityElement.Attribute("Name").Value,
var localId = Int32.Parse(activityElement.Attribute("Id").Value); Start = Boolean.Parse(activityElement.Attribute("Start").Value),
var activity = new ActivityRecord { X = Int32.Parse(activityElement.Attribute("X").Value),
Name = activityElement.Attribute("Name").Value, Y = Int32.Parse(activityElement.Attribute("Y").Value),
Start = Boolean.Parse(activityElement.Attribute("Start").Value), State = activityElement.Element("State").Value
X = Int32.Parse(activityElement.Attribute("X").Value), };
Y = Int32.Parse(activityElement.Attribute("Y").Value),
State = activityElement.Element("State").Value activitiesDictionary.Add(localId, activity);
}; workflowDefinition.ActivityRecords.Add(activity);
}
activitiesDictionary.Add(localId, activity);
workflowDefinition.ActivityRecords.Add(activity); foreach (var transitionElement in transitionsElement.Elements()) {
} var sourceActivityId = Int32.Parse(transitionElement.Attribute("SourceActivityId").Value);
var sourceEndpoint = transitionElement.Attribute("SourceEndpoint").Value;
foreach (var transitionElement in transitionsElement.Elements()) { var destinationActivityId = Int32.Parse(transitionElement.Attribute("DestinationActivityId").Value);
var sourceActivityId = Int32.Parse(transitionElement.Attribute("SourceActivityId").Value); var destinationEndpoint = transitionElement.Attribute("DestinationEndpoint").Value;
var sourceEndpoint = transitionElement.Attribute("SourceEndpoint").Value;
var destinationActivityId = Int32.Parse(transitionElement.Attribute("DestinationActivityId").Value); workflowDefinition.TransitionRecords.Add(new TransitionRecord {
var destinationEndpoint = transitionElement.Attribute("DestinationEndpoint").Value; SourceActivityRecord = activitiesDictionary[sourceActivityId],
SourceEndpoint = sourceEndpoint,
workflowDefinition.TransitionRecords.Add(new TransitionRecord { DestinationActivityRecord = activitiesDictionary[destinationActivityId],
SourceActivityRecord = activitiesDictionary[sourceActivityId], DestinationEndpoint = destinationEndpoint
SourceEndpoint = sourceEndpoint, });
DestinationActivityRecord = activitiesDictionary[destinationActivityId], }
DestinationEndpoint = destinationEndpoint }
}); }
}
} private WorkflowDefinitionRecord GetOrCreateWorkflowDefinition(string name) {
var workflowDefinition = _workflowDefinitionRepository.Get(x => x.Name == name);
recipeContext.Executed = true;
} if (workflowDefinition == null) {
workflowDefinition = new WorkflowDefinitionRecord {
private WorkflowDefinitionRecord GetOrCreateWorkflowDefinition(string name) { Name = name
var workflowDefinition = _workflowDefinitionRepository.Get(x => x.Name == name); };
_workflowDefinitionRepository.Create(workflowDefinition);
if (workflowDefinition == null) { }
workflowDefinition = new WorkflowDefinitionRecord { else {
Name = name CleanWorkFlow(workflowDefinition);
}; }
_workflowDefinitionRepository.Create(workflowDefinition);
} return workflowDefinition;
else { }
CleanWorkFlow(workflowDefinition);
} private void CleanWorkFlow(WorkflowDefinitionRecord workflowDefinition) {
foreach (var activityRecord in workflowDefinition.ActivityRecords) {
return workflowDefinition; _activityRepository.Delete(activityRecord);
} }
workflowDefinition.ActivityRecords.Clear();
private void CleanWorkFlow(WorkflowDefinitionRecord workflowDefinition) {
foreach (var activityRecord in workflowDefinition.ActivityRecords) { foreach (var transitionRecord in workflowDefinition.TransitionRecords) {
_activityRepository.Delete(activityRecord); _transitionRepository.Delete(transitionRecord);
} }
workflowDefinition.ActivityRecords.Clear(); workflowDefinition.TransitionRecords.Clear();
}
foreach (var transitionRecord in workflowDefinition.TransitionRecords) { }
_transitionRepository.Delete(transitionRecord); }
}
workflowDefinition.TransitionRecords.Clear();
}
}
}