mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-22 03:37:25 +08:00
RecipeManager::Execute invokes RecipeHandlers
Added built-in recipehandlers Unit test for handler invocation. --HG-- branch : recipe
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
|
||||
<Feature disable="f1, f2" enable="f3,f4" />
|
||||
|
||||
<Metadata>
|
||||
<MetaData>
|
||||
<Types>
|
||||
<Blog creatable="true">
|
||||
<Body format="abodyformat"/>
|
||||
@@ -23,7 +23,7 @@
|
||||
</Parts>
|
||||
<Fields>
|
||||
</Fields>
|
||||
</Metadata>
|
||||
</MetaData>
|
||||
|
||||
<Command>
|
||||
command1
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
<Theme src="source dir" enabled="true" current="true" />
|
||||
<Theme name="theme1" repository="somerepo" replace="true" />
|
||||
|
||||
<CleanUpInactive />
|
||||
|
||||
<Custom1 attr2="value1" />
|
||||
<Custom2 attr2="value2" />
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
@@ -66,6 +67,7 @@ namespace Orchard.Tests.Modules.Recipes.Services {
|
||||
builder.RegisterType<Environment.Extensions.ExtensionManagerTests.StubLoaders>().As<IExtensionLoader>();
|
||||
builder.RegisterType<RecipeParser>().As<IRecipeParser>();
|
||||
builder.RegisterType<StubWebSiteFolder>().As<IWebSiteFolder>();
|
||||
builder.RegisterType<CustomRecipeHandler>().As<IRecipeHandler>();
|
||||
|
||||
_container = builder.Build();
|
||||
_recipeManager = _container.Resolve<IRecipeManager>();
|
||||
@@ -112,12 +114,36 @@ namespace Orchard.Tests.Modules.Recipes.Services {
|
||||
var sampleRecipe = recipes[0];
|
||||
var recipeSteps = (List<RecipeStep>) sampleRecipe.RecipeSteps;
|
||||
|
||||
Assert.That(recipeSteps.Count, Is.EqualTo(11));
|
||||
Assert.That(recipeSteps.Count, Is.EqualTo(12));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseRecipeThrowsOnInvalidXml() {
|
||||
Assert.Throws(typeof(XmlException), () => _recipeParser.ParseRecipe("<reipe></recipe>"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ExecuteInvokesHandlersWithSteps() {
|
||||
var recipes = (List<Recipe>)_recipeManager.DiscoverRecipes("Sample1");
|
||||
Assert.That(recipes.Count, Is.EqualTo(1));
|
||||
|
||||
var sampleRecipe = recipes[0];
|
||||
_recipeManager.Execute(sampleRecipe);
|
||||
|
||||
Assert.That(CustomRecipeHandler.AttributeValue == "value1");
|
||||
}
|
||||
}
|
||||
|
||||
public class CustomRecipeHandler : IRecipeHandler {
|
||||
public static string AttributeValue;
|
||||
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
if (recipeContext.RecipeStep.Name == "Custom1") {
|
||||
foreach (var attribute in recipeContext.RecipeStep.Step.Attributes().Where(attribute => attribute.Name == "attr1")) {
|
||||
AttributeValue = attribute.Value;
|
||||
recipeContext.Executed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -52,6 +52,14 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="RecipeHandlers\CleanUpInactiveRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\CommandRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\FeatureRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\MetaDataRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\MigrationRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\ModuleRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\SettingsRecipeHandler.cs" />
|
||||
<Compile Include="RecipeHandlers\ThemeRecipeHandler.cs" />
|
||||
<Compile Include="Services\RecipeManager.cs" />
|
||||
<Compile Include="Services\RecipeParser.cs" />
|
||||
</ItemGroup>
|
||||
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class CleanUpInactiveRecipeHandler : IRecipeHandler {
|
||||
public CleanUpInactiveRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <CleanUpInactive> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class CommandRecipeHandler : IRecipeHandler {
|
||||
public CommandRecipeHandler () {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Command> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class FeatureRecipeHandler : IRecipeHandler {
|
||||
public FeatureRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Feature> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class MetaDataRecipeHandler : IRecipeHandler {
|
||||
public MetaDataRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <MetaData> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class MigrationRecipeHandler : IRecipeHandler {
|
||||
public MigrationRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Migration> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class ModuleRecipeHandler : IRecipeHandler {
|
||||
public ModuleRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Module> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class SettingsRecipeHandler : IRecipeHandler {
|
||||
public SettingsRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Settings> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
|
||||
namespace Orchard.Recipes.RecipeHandlers {
|
||||
public class ThemeRecipeHandler : IRecipeHandler {
|
||||
public ThemeRecipeHandler() {
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
// handles the <Theme> step
|
||||
public void ExecuteRecipeStep(RecipeContext recipeContext) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Orchard.Environment.Extensions;
|
||||
@@ -33,7 +32,20 @@ namespace Orchard.Recipes.Services {
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
public void Execute(Recipe recipe) {
|
||||
throw new NotImplementedException();
|
||||
var recipeContext = new RecipeContext { Recipe = recipe };
|
||||
|
||||
// TODO: Run each step inside a transaction boundary.
|
||||
// TODO: Output should go into a report.
|
||||
foreach (var recipeStep in recipe.RecipeSteps) {
|
||||
recipeContext.RecipeStep = recipeStep;
|
||||
recipeContext.Executed = false;
|
||||
foreach (var handler in _recipeHandlers) {
|
||||
handler.ExecuteRecipeStep(recipeContext);
|
||||
}
|
||||
if (!recipeContext.Executed) {
|
||||
Logger.Error("Could not execute recipe step '{0}' because the recipe handler was not found.", recipeContext.RecipeStep.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<Recipe> DiscoverRecipes(string extensionName) {
|
||||
|
@@ -6,4 +6,8 @@
|
||||
<WebSite>http://orchardproject.net</WebSite>
|
||||
<Tags>developer</Tags>
|
||||
<Version>1.0</Version>
|
||||
|
||||
<!-- Steps -->
|
||||
|
||||
<CleanUpInactive />
|
||||
</Recipe>
|
Reference in New Issue
Block a user