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

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