mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Refactored Workflows import/export step.
This commit is contained in:
@@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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 ?? ""))))));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user