From 1ae1770b0df25b03ec27b426aac1ee0a228c58b4 Mon Sep 17 00:00:00 2001 From: rpaquay Date: Wed, 20 Jan 2010 06:43:39 +0000 Subject: [PATCH] Initial work to support loading MVC Areas as Orchard modules --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4045728 --- src/Orchard/Environment/OrchardStarter.cs | 4 ++ src/Orchard/Extensions/AreaFolders.cs | 9 +++ src/Orchard/Extensions/ExtensionFolders.cs | 67 +++++++++++++++++++ .../Extensions/Loaders/AreaExtensionLoader.cs | 26 +++++++ .../Loaders/DynamicExtensionLoader.cs | 2 +- src/Orchard/Extensions/PackageFolders.cs | 40 +---------- src/Orchard/Extensions/ThemeFolders.cs | 40 ++--------- src/Orchard/Orchard.csproj | 3 + 8 files changed, 117 insertions(+), 74 deletions(-) create mode 100644 src/Orchard/Extensions/AreaFolders.cs create mode 100644 src/Orchard/Extensions/ExtensionFolders.cs create mode 100644 src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index bf441064c..cea0a1b74 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -30,6 +30,7 @@ namespace Orchard.Environment { builder.Register().As().ContainerScoped(); builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); builder.Register().As().SingletonScoped(); builder.Register().As().SingletonScoped(); builder.Register().As().SingletonScoped(); @@ -38,6 +39,9 @@ namespace Orchard.Environment { builder.Register().As() .WithArguments(new NamedParameter("paths", new[] { "~/Core", "~/Packages" })) .SingletonScoped(); + builder.Register().As() + .WithArguments(new NamedParameter("paths", new[] { "~/Areas" })) + .SingletonScoped(); builder.Register().As() .WithArguments(new NamedParameter("paths", new[] { "~/Core", "~/Themes" })) .SingletonScoped(); diff --git a/src/Orchard/Extensions/AreaFolders.cs b/src/Orchard/Extensions/AreaFolders.cs new file mode 100644 index 000000000..5868820ff --- /dev/null +++ b/src/Orchard/Extensions/AreaFolders.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Orchard.Extensions { + public class AreaFolders : ExtensionFolders { + public AreaFolders(IEnumerable paths) : + base(paths, "Package.txt", true/*isManifestOptional*/) { + } + } +} \ No newline at end of file diff --git a/src/Orchard/Extensions/ExtensionFolders.cs b/src/Orchard/Extensions/ExtensionFolders.cs new file mode 100644 index 000000000..996a970b8 --- /dev/null +++ b/src/Orchard/Extensions/ExtensionFolders.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Orchard.Extensions.Helpers; +using Yaml.Grammar; + +namespace Orchard.Extensions { + public class ExtensionFolders : IExtensionFolders { + private readonly IEnumerable _paths; + private readonly string _manifestName; + private readonly bool _manifestIsOptional; + + public ExtensionFolders(IEnumerable paths, string manifestName, bool manifestIsOptional) { + _paths = paths; + _manifestName = manifestName; + _manifestIsOptional = manifestIsOptional; + } + + public IEnumerable ListNames() { + foreach (var path in _paths) { + if (!Directory.Exists(PathHelpers.GetPhysicalPath(path))) + continue; + + foreach (var directoryName in Directory.GetDirectories(PathHelpers.GetPhysicalPath(path))) { + if (_manifestIsOptional || File.Exists(Path.Combine(directoryName, _manifestName))) { + yield return Path.GetFileName(directoryName); + } + } + } + } + + public ParseResult ParseManifest(string name) { + foreach (var path in _paths) { + if (!Directory.Exists(PathHelpers.GetPhysicalPath(path))) + continue; + + var extensionDirectoryPath = Path.Combine(PathHelpers.GetPhysicalPath(path), name); + if (!Directory.Exists(PathHelpers.GetPhysicalPath(extensionDirectoryPath))) + continue; + + var extensionManifestPath = Path.Combine(extensionDirectoryPath, _manifestName); + + if (File.Exists(extensionManifestPath)) { + var yamlStream = YamlParser.Load(extensionManifestPath); + return new ParseResult { + Location = path, + Name = name, + YamlDocument = yamlStream.Documents.Single() + }; + } + + if (_manifestIsOptional) { + var yamlInput = new TextInput(string.Format("name: {0}", name)); + var parser = new YamlParser(); + bool success; + var yamlStream = parser.ParseYamlStream(yamlInput, out success); + return new ParseResult { + Location = path, + Name = name, + YamlDocument = yamlStream.Documents.Single() + }; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs b/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs new file mode 100644 index 000000000..4687e32fd --- /dev/null +++ b/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace Orchard.Extensions.Loaders { + public class AreaExtensionLoader : IExtensionLoader { + public int Order { get { return 5; } } + + public ExtensionEntry Load(ExtensionDescriptor descriptor) { + if (descriptor.Location == "~/Areas") { + + var assembly = Assembly.Load("Orchard.Web"); + return new ExtensionEntry { + Descriptor = descriptor, + Assembly = assembly, + ExportedTypes = assembly.GetExportedTypes().Where(x => IsTypeFromPackage(x, descriptor)) + }; + } + return null; + } + + private static bool IsTypeFromPackage(Type type, ExtensionDescriptor descriptor) { + return (type.Namespace + ".").StartsWith("Orchard.Web.Areas." + descriptor.Name + "."); + } + } +} diff --git a/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs index 2acf02a7b..51ec482b1 100644 --- a/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs @@ -8,7 +8,7 @@ using System.Web.Hosting; namespace Orchard.Extensions.Loaders { public class DynamicExtensionLoader : IExtensionLoader { - public int Order { get { return 4; } } + public int Order { get { return 10; } } public ExtensionEntry Load(ExtensionDescriptor descriptor) { if (HostingEnvironment.IsHosted == false) diff --git a/src/Orchard/Extensions/PackageFolders.cs b/src/Orchard/Extensions/PackageFolders.cs index 80ed0b97a..07f3c2803 100644 --- a/src/Orchard/Extensions/PackageFolders.cs +++ b/src/Orchard/Extensions/PackageFolders.cs @@ -1,43 +1,9 @@ using System.Collections.Generic; -using System.IO; -using System.Linq; -using Orchard.Extensions.Helpers; -using Yaml.Grammar; namespace Orchard.Extensions { - public class PackageFolders : IExtensionFolders { - private readonly IEnumerable _paths; - - public PackageFolders(IEnumerable paths) { - _paths = paths; - } - - public IEnumerable ListNames() { - foreach (var path in _paths) { - if (!Directory.Exists(PathHelpers.GetPhysicalPath(path))) - continue; - foreach (var directoryName in Directory.GetDirectories(PathHelpers.GetPhysicalPath(path))) { - if (File.Exists(Path.Combine(directoryName, "Package.txt"))) - yield return Path.GetFileName(directoryName); - } - } - } - - public ParseResult ParseManifest(string name) { - foreach (var path in _paths) { - var extensionDirectoryPath = Path.Combine(PathHelpers.GetPhysicalPath(path), name); - var extensionManifestPath = Path.Combine(extensionDirectoryPath, "Package.txt"); - if (!File.Exists(extensionManifestPath)) { - continue; - } - var yamlStream = YamlParser.Load(extensionManifestPath); - return new ParseResult { - Location = path, - Name = name, - YamlDocument = yamlStream.Documents.Single() - }; - } - return null; + public class PackageFolders : ExtensionFolders { + public PackageFolders(IEnumerable paths) : + base(paths, "Package.txt", false/*isManifestOptional*/) { } } } diff --git a/src/Orchard/Extensions/ThemeFolders.cs b/src/Orchard/Extensions/ThemeFolders.cs index f9ae6895a..534877497 100644 --- a/src/Orchard/Extensions/ThemeFolders.cs +++ b/src/Orchard/Extensions/ThemeFolders.cs @@ -1,41 +1,9 @@ using System.Collections.Generic; -using System.IO; -using System.Linq; -using Orchard.Extensions.Helpers; -using Yaml.Grammar; namespace Orchard.Extensions { - public class ThemeFolders : IExtensionFolders { - private readonly IEnumerable _paths; - - public ThemeFolders(IEnumerable paths) { - _paths = paths; - } - - public IEnumerable ListNames() { - foreach (var path in _paths) { - foreach (var directoryName in Directory.GetDirectories(PathHelpers.GetPhysicalPath(path))) { - if (File.Exists(Path.Combine(directoryName, "Theme.txt"))) - yield return Path.GetFileName(directoryName); - } - } - } - - public ParseResult ParseManifest(string name) { - foreach (var path in _paths) { - var extensionDirectoryPath = Path.Combine(PathHelpers.GetPhysicalPath(path), name); - var extensionManifestPath = Path.Combine(extensionDirectoryPath, "Theme.txt"); - if (!File.Exists(extensionManifestPath)) { - continue; - } - var yamlStream = YamlParser.Load(extensionManifestPath); - return new ParseResult { - Location = path, - Name = name, - YamlDocument = yamlStream.Documents.Single() - }; - } - return null; + public class ThemeFolders : ExtensionFolders { + public ThemeFolders(IEnumerable paths) : + base(paths, "Theme.txt", false/*manifestIsOptional*/) { } } -} +} \ No newline at end of file diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 7b874af8f..b72c6f0c5 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -131,6 +131,9 @@ + + +