diff --git a/src/Orchard.Tests.Modules/Recipes/Services/FoldersData/Sample1/Recipes/cms.recipe.xml b/src/Orchard.Tests.Modules/Recipes/Services/FoldersData/Sample1/Recipes/cms.recipe.xml index 736abab44..60a780329 100644 --- a/src/Orchard.Tests.Modules/Recipes/Services/FoldersData/Sample1/Recipes/cms.recipe.xml +++ b/src/Orchard.Tests.Modules/Recipes/Services/FoldersData/Sample1/Recipes/cms.recipe.xml @@ -1,19 +1,21 @@  - - cms - a sample Orchard recipe describing a cms - orchard - http://orchardproject.net - tag1, tag2 - 1.1 - + + + cms + a sample Orchard recipe describing a cms + orchard + http://orchardproject.net + tag1, tag2 + 1.1 + + - + - - + + @@ -23,26 +25,27 @@ - - + + command1 command2 command3 - + - + - + - + - + + diff --git a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs index 52a775b08..a3f56e429 100644 --- a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs +++ b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs @@ -18,6 +18,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { public class RecipeManagerTests { private IContainer _container; private IRecipeManager _recipeManager; + private IRecipeHarvester _recipeHarvester; private IRecipeParser _recipeParser; private IExtensionFolders _folders; @@ -61,6 +62,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { var builder = new ContainerBuilder(); _folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder()); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterInstance(_folders).As(); @@ -72,6 +74,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { _container = builder.Build(); _recipeManager = _container.Resolve(); _recipeParser = _container.Resolve(); + _recipeHarvester = _container.Resolve(); } [TearDown] @@ -80,21 +83,21 @@ namespace Orchard.Tests.Modules.Recipes.Services { } [Test] - public void DiscoverRecipesFailsToFindRecipesWhenCalledWithNotExistingExtension() { - var recipes = (List) _recipeManager.DiscoverRecipes("cantfindme"); + public void HarvestRecipesFailsToFindRecipesWhenCalledWithNotExistingExtension() { + var recipes = (List) _recipeHarvester.HarvestRecipes("cantfindme"); Assert.That(recipes.Count, Is.EqualTo(0)); } [Test] - public void DiscoverRecipesShouldDiscoverRecipeXmlFiles() { - var recipes = (List)_recipeManager.DiscoverRecipes("Sample1"); + public void HarvestRecipesShouldHarvestRecipeXmlFiles() { + var recipes = (List)_recipeHarvester.HarvestRecipes("Sample1"); Assert.That(recipes.Count, Is.EqualTo(1)); } [Test] public void ParseRecipeLoadsRecipeMetaDataIntoModel() { - var recipes = (List) _recipeManager.DiscoverRecipes("Sample1"); + var recipes = (List) _recipeHarvester.HarvestRecipes("Sample1"); Assert.That(recipes.Count, Is.EqualTo(1)); var sampleRecipe = recipes[0]; @@ -108,7 +111,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { [Test] public void ParseRecipeLoadsRecipeStepsIntoModel() { - var recipes = (List)_recipeManager.DiscoverRecipes("Sample1"); + var recipes = (List)_recipeHarvester.HarvestRecipes("Sample1"); Assert.That(recipes.Count, Is.EqualTo(1)); var sampleRecipe = recipes[0]; @@ -124,7 +127,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { [Test] public void ExecuteInvokesHandlersWithSteps() { - var recipes = (List)_recipeManager.DiscoverRecipes("Sample1"); + var recipes = (List)_recipeHarvester.HarvestRecipes("Sample1"); Assert.That(recipes.Count, Is.EqualTo(1)); var sampleRecipe = recipes[0]; diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Module.txt b/src/Orchard.Web/Modules/Orchard.Recipes/Module.txt index ec7abe498..c889105c1 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Module.txt @@ -7,6 +7,6 @@ OrchardVersion: 1.0.20 Description: Provides Orchard Recipes. Features: Orchard.Recipes: - Name: Recipes + Name: Recipes Description: Implementation of Orchard recipes. Category: Core diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj index 119a0768d..6eb208952 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj @@ -55,11 +55,12 @@ - + + diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Properties/AssemblyInfo.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Properties/AssemblyInfo.cs index 0e105fa09..7cb7a79a6 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Properties/AssemblyInfo.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -8,9 +8,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("Orchard.Recipes")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("MSIT")] -[assembly: AssemblyProduct("Orchard.Recipes")] -[assembly: AssemblyCopyright("Copyright © MSIT 2011")] +[assembly: AssemblyProduct("Orchard")] +[assembly: AssemblyCopyright("Copyright © Outercurve Foundation 2009")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -31,5 +30,6 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.20")] +[assembly: AssemblyFileVersion("1.0.20")] +[assembly: SecurityTransparent] \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs index f93c034c5..29c59faf2 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs @@ -4,8 +4,8 @@ using Orchard.Recipes.Models; using Orchard.Recipes.Services; namespace Orchard.Recipes.RecipeHandlers { - public class MetaDataRecipeHandler : IRecipeHandler { - public MetaDataRecipeHandler() { + public class MetadataRecipeHandler : IRecipeHandler { + public MetadataRecipeHandler() { Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -13,7 +13,7 @@ namespace Orchard.Recipes.RecipeHandlers { public Localizer T { get; set; } ILogger Logger { get; set; } - // handles the step + // handles the step public void ExecuteRecipeStep(RecipeContext recipeContext) { } } diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeHarvester.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeHarvester.cs new file mode 100644 index 000000000..1664e417e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeHarvester.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Orchard.Environment.Extensions; +using Orchard.FileSystems.WebSite; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Recipes.Models; + +namespace Orchard.Recipes.Services { + public class RecipeHarvester : IRecipeHarvester { + private readonly IExtensionManager _extensionManager; + private readonly IWebSiteFolder _webSiteFolder; + private readonly IRecipeParser _recipeParser; + + public RecipeHarvester( + IExtensionManager extensionManager, + IWebSiteFolder webSiteFolder, + IRecipeParser recipeParser) { + _extensionManager = extensionManager; + _webSiteFolder = webSiteFolder; + _recipeParser = recipeParser; + + Logger = NullLogger.Instance; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + ILogger Logger { get; set; } + + public IEnumerable HarvestRecipes(string extensionName) { + var recipes = new List(); + var extension = _extensionManager.GetExtension(extensionName); + if (extension != null) { + var recipeLocation = Path.Combine(extension.Location, extensionName, "Recipes"); + var recipeFiles = _webSiteFolder.ListFiles(recipeLocation, true); + recipes.AddRange( + from recipeFile in recipeFiles + where recipeFile.EndsWith(".recipe.xml", StringComparison.OrdinalIgnoreCase) + select _recipeParser.ParseRecipe(_webSiteFolder.ReadFile(recipeFile))); + } + else { + Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionName); + } + + return recipes; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeManager.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeManager.cs index d06aa3922..da1e4fdba 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeManager.cs @@ -1,27 +1,13 @@ using System.Collections.Generic; -using System.IO; -using System.Linq; -using Orchard.Environment.Extensions; -using Orchard.FileSystems.WebSite; using Orchard.Localization; using Orchard.Logging; using Orchard.Recipes.Models; namespace Orchard.Recipes.Services { public class RecipeManager : IRecipeManager { - private readonly IExtensionManager _extensionManager; - private readonly IWebSiteFolder _webSiteFolder; - private readonly IRecipeParser _recipeParser; private readonly IEnumerable _recipeHandlers; - public RecipeManager( - IExtensionManager extensionManager, - IWebSiteFolder webSiteFolder, - IRecipeParser recipeParser, - IEnumerable recipeHandlers) { - _extensionManager = extensionManager; - _webSiteFolder = webSiteFolder; - _recipeParser = recipeParser; + public RecipeManager(IEnumerable recipeHandlers) { _recipeHandlers = recipeHandlers; Logger = NullLogger.Instance; @@ -36,6 +22,7 @@ namespace Orchard.Recipes.Services { // TODO: Run each step inside a transaction boundary. // TODO: Output should go into a report. + // TODO: Eventually return a guid.tostring("n") execution id foreach (var recipeStep in recipe.RecipeSteps) { recipeContext.RecipeStep = recipeStep; recipeContext.Executed = false; @@ -47,23 +34,5 @@ namespace Orchard.Recipes.Services { } } } - - public IEnumerable DiscoverRecipes(string extensionName) { - var recipes = new List(); - var extension = _extensionManager.GetExtension(extensionName); - if (extension != null) { - var recipeLocation = Path.Combine(extension.Location, extensionName, "Recipes"); - var recipeFiles = _webSiteFolder.ListFiles(recipeLocation, true); - recipes.AddRange( - from recipeFile in recipeFiles - where recipeFile.EndsWith(".recipe.xml") - select _recipeParser.ParseRecipe(_webSiteFolder.ReadFile(recipeFile))); - } - else { - Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionName); - } - - return recipes; - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeParser.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeParser.cs index 83f2c0578..aaa175b01 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeParser.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Services/RecipeParser.cs @@ -26,29 +26,38 @@ namespace Orchard.Recipes.Services { textReader.Close(); foreach (var element in recipeTree.Elements()) { - switch(element.Name.ToString()) { - case "Name": - recipe.Name = element.Value; - break; - case "Description": - recipe.Description = element.Value; - break; - case "Author": - recipe.Author = element.Value; - break; - case "WebSite": - recipe.WebSite = element.Value; - break; - case "Version": - recipe.Version = element.Value; - break; - case "Tags": - recipe.Tags = element.Value; - break; - default: - var recipeStep = new RecipeStep {Name = element.Name.ToString(), Step = element}; - recipeSteps.Add(recipeStep); - break; + // Recipe mETaDaTA + if (element.Name.LocalName == "Recipe") { + foreach (var metadataElement in element.Elements()) { + switch (metadataElement.Name.LocalName) { + case "Name": + recipe.Name = metadataElement.Value; + break; + case "Description": + recipe.Description = metadataElement.Value; + break; + case "Author": + recipe.Author = metadataElement.Value; + break; + case "WebSite": + recipe.WebSite = metadataElement.Value; + break; + case "Version": + recipe.Version = metadataElement.Value; + break; + case "Tags": + recipe.Tags = metadataElement.Value; + break; + default: + Logger.Error("Unrecognized recipe metadata element {0} encountered. Skipping.", metadataElement.Name.LocalName); + break; + } + } + } + // Recipe step + else { + var recipeStep = new RecipeStep { Name = element.Name.LocalName, Step = element }; + recipeSteps.Add(recipeStep); } } recipe.RecipeSteps = recipeSteps; diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 7e8640475..ca2f998a6 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -195,6 +195,7 @@ + diff --git a/src/Orchard/Recipes/Services/IRecipeHarvester.cs b/src/Orchard/Recipes/Services/IRecipeHarvester.cs new file mode 100644 index 000000000..1b0287932 --- /dev/null +++ b/src/Orchard/Recipes/Services/IRecipeHarvester.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; +using Orchard.Recipes.Models; + +namespace Orchard.Recipes.Services { + public interface IRecipeHarvester : IDependency { + IEnumerable HarvestRecipes(string extensionName); + } +} diff --git a/src/Orchard/Recipes/Services/IRecipeManager.cs b/src/Orchard/Recipes/Services/IRecipeManager.cs index 52fa2e1c2..461811a4b 100644 --- a/src/Orchard/Recipes/Services/IRecipeManager.cs +++ b/src/Orchard/Recipes/Services/IRecipeManager.cs @@ -1,9 +1,7 @@ -using System.Collections.Generic; -using Orchard.Recipes.Models; +using Orchard.Recipes.Models; namespace Orchard.Recipes.Services { public interface IRecipeManager : IDependency { void Execute(Recipe recipe); - IEnumerable DiscoverRecipes(string extensionName); } }