RecipeManager::Execute invokes RecipeHandlers

Added built-in recipehandlers
Unit test for handler invocation.

--HG--
branch : recipe
This commit is contained in:
Suha Can
2011-02-11 16:15:00 -08:00
parent 1acd0f0031
commit 194796c479
13 changed files with 218 additions and 6 deletions

View File

@@ -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" />

View File

@@ -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;
}
}
}
}
}

View File

@@ -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>

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {
}
}
}

View File

@@ -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) {

View File

@@ -6,4 +6,8 @@
<WebSite>http://orchardproject.net</WebSite>
<Tags>developer</Tags>
<Version>1.0</Version>
<!-- Steps -->
<CleanUpInactive />
</Recipe>