Slightly refactor ExtensionLoader.Load method implementations

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-06-18 14:27:04 -07:00
parent a9593f69ff
commit a7841bd919
9 changed files with 168 additions and 105 deletions

View File

@@ -3,10 +3,12 @@ using System.Collections.Generic;
using System.Linq;
using Autofac;
using NUnit.Framework;
using Orchard.Caching;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
using Orchard.FileSystems.Dependencies;
using Orchard.Tests.Extensions.ExtensionTypes;
namespace Orchard.Tests.Environment.Extensions {
@@ -43,21 +45,49 @@ namespace Orchard.Tests.Environment.Extensions {
}
}
public class StubLoaders : ExtensionLoaderBase {
public class StubLoaders : IExtensionLoader {
#region Implementation of IExtensionLoader
public override int Order {
public int Order {
get { return 1; }
}
public override ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) {
public string Name {
get { return this.GetType().Name; }
}
public ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) {
return new ExtensionProbeEntry { Descriptor = descriptor, Loader = this };
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
public ExtensionEntry Load(ExtensionDescriptor descriptor) {
return new ExtensionEntry { Descriptor = descriptor, ExportedTypes = new[] { typeof(Alpha), typeof(Beta), typeof(Phi) } };
}
public void ExtensionActivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) {
throw new NotImplementedException();
}
public void ExtensionDeactivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) {
throw new NotImplementedException();
}
public void ExtensionRemoved(ExtensionLoadingContext ctx, DependencyDescriptor dependency) {
throw new NotImplementedException();
}
public void Monitor(ExtensionDescriptor extension, Action<IVolatileToken> monitor) {
throw new NotImplementedException();
}
public string GetWebFormAssemblyDirective(DependencyDescriptor dependency) {
throw new NotImplementedException();
}
public IEnumerable<string> GetWebFormVirtualDependencies(DependencyDescriptor dependency) {
throw new NotImplementedException();
}
#endregion
}

View File

@@ -3,10 +3,12 @@ using System.Collections.Generic;
using System.Linq;
using Autofac;
using NUnit.Framework;
using Orchard.Caching;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
using Orchard.FileSystems.Dependencies;
using Orchard.Tests.Extensions.ExtensionTypes;
namespace Orchard.Tests.Environment.Extensions {
@@ -42,21 +44,49 @@ namespace Orchard.Tests.Environment.Extensions {
}
}
public class StubLoaders : ExtensionLoaderBase {
public class StubLoaders : IExtensionLoader {
#region Implementation of IExtensionLoader
public override int Order {
public int Order {
get { return 1; }
}
public override ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) {
public string Name {
get { throw new NotImplementedException(); }
}
public ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) {
return new ExtensionProbeEntry { Descriptor = descriptor, Loader = this };
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
public ExtensionEntry Load(ExtensionDescriptor descriptor) {
return new ExtensionEntry { Descriptor = descriptor, ExportedTypes = new[] { typeof(Alpha), typeof(Beta), typeof(Phi) } };
}
public void ExtensionActivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) {
throw new NotImplementedException();
}
public void ExtensionDeactivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) {
throw new NotImplementedException();
}
public void ExtensionRemoved(ExtensionLoadingContext ctx, DependencyDescriptor dependency) {
throw new NotImplementedException();
}
public void Monitor(ExtensionDescriptor extension, Action<IVolatileToken> monitor) {
throw new NotImplementedException();
}
public string GetWebFormAssemblyDirective(DependencyDescriptor dependency) {
throw new NotImplementedException();
}
public IEnumerable<string> GetWebFormVirtualDependencies(DependencyDescriptor dependency) {
throw new NotImplementedException();
}
#endregion
}

View File

@@ -10,7 +10,8 @@ namespace Orchard.Environment.Extensions.Loaders {
public class AreaExtensionLoader : ExtensionLoaderBase {
private readonly IDependenciesFolder _dependenciesFolder;
public AreaExtensionLoader(IDependenciesFolder dependenciesFolder) {
public AreaExtensionLoader(IDependenciesFolder dependenciesFolder)
: base(dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
Logger = NullLogger.Instance;
}
@@ -31,20 +32,16 @@ namespace Orchard.Environment.Extensions.Loaders {
return null;
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
Logger.Information("Loading extension \"{0}\"", dependency.Name);
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
Logger.Information("Loading extension \"{0}\"", descriptor.Name);
var assembly = Assembly.Load("Orchard.Web");
var assembly = Assembly.Load("Orchard.Web");
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes().Where(x => IsTypeFromModule(x, descriptor))
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes().Where(x => IsTypeFromModule(x, descriptor))
};
}
private static bool IsTypeFromModule(Type type, ExtensionDescriptor descriptor) {

View File

@@ -14,7 +14,8 @@ namespace Orchard.Environment.Extensions.Loaders {
public class CoreExtensionLoader : ExtensionLoaderBase {
private readonly IDependenciesFolder _dependenciesFolder;
public CoreExtensionLoader(IDependenciesFolder dependenciesFolder) {
public CoreExtensionLoader(IDependenciesFolder dependenciesFolder)
: base(dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
Logger = NullLogger.Instance;
}
@@ -35,20 +36,16 @@ namespace Orchard.Environment.Extensions.Loaders {
return null;
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
Logger.Information("Loading extension \"{0}\"", dependency.Name);
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
Logger.Information("Loading extension \"{0}\"", descriptor.Name);
var assembly = Assembly.Load("Orchard.Core");
var assembly = Assembly.Load("Orchard.Core");
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes().Where(x => IsTypeFromModule(x, descriptor))
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes().Where(x => IsTypeFromModule(x, descriptor))
};
}
private static bool IsTypeFromModule(Type type, ExtensionDescriptor descriptor) {

View File

@@ -18,7 +18,8 @@ namespace Orchard.Environment.Extensions.Loaders {
IBuildManager buildManager,
IVirtualPathProvider virtualPathProvider,
IVirtualPathMonitor virtualPathMonitor,
IDependenciesFolder dependenciesFolder) {
IDependenciesFolder dependenciesFolder)
: base(dependenciesFolder) {
_buildManager = buildManager;
_virtualPathProvider = virtualPathProvider;
@@ -75,20 +76,19 @@ namespace Orchard.Environment.Extensions.Loaders {
};
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
string projectPath = GetProjectPath(descriptor);
if (projectPath == null)
return null;
var assembly = _buildManager.GetCompiledAssembly(dependency.VirtualPath);
Logger.Information("Loading extension \"{0}\": assembly name=\"{1}\"", dependency.Name, assembly.GetName().Name);
var assembly = _buildManager.GetCompiledAssembly(projectPath);
Logger.Information("Loading extension \"{0}\": assembly name=\"{1}\"", descriptor.Name, assembly.GetName().Name);
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes(),
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes(),
};
}
private string GetProjectPath(ExtensionDescriptor descriptor) {

View File

@@ -7,17 +7,32 @@ using Orchard.FileSystems.Dependencies;
namespace Orchard.Environment.Extensions.Loaders {
public abstract class ExtensionLoaderBase : IExtensionLoader {
private readonly IDependenciesFolder _dependenciesFolder;
protected ExtensionLoaderBase(IDependenciesFolder dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
}
public abstract int Order { get; }
public string Name { get { return this.GetType().Name; } }
public abstract ExtensionProbeEntry Probe(ExtensionDescriptor descriptor);
public abstract ExtensionEntry Load(ExtensionDescriptor descriptor);
public virtual void ExtensionActivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) {}
public virtual void ExtensionDeactivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension){}
public ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
return LoadWorker(descriptor);
}
return null;
}
public virtual void ExtensionActivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) { }
public virtual void ExtensionDeactivated(ExtensionLoadingContext ctx, bool isNewExtension, ExtensionDescriptor extension) { }
public virtual void ExtensionRemoved(ExtensionLoadingContext ctx, DependencyDescriptor dependency) { }
public virtual void Monitor(ExtensionDescriptor extension, Action<IVolatileToken> monitor) { }
public abstract ExtensionEntry LoadWorker(ExtensionDescriptor descriptor);
public virtual string GetWebFormAssemblyDirective(DependencyDescriptor dependency) {
return null;
}

View File

@@ -18,7 +18,12 @@ namespace Orchard.Environment.Extensions.Loaders {
private readonly IVirtualPathProvider _virtualPathProvider;
private readonly IVirtualPathMonitor _virtualPathMonitor;
public PrecompiledExtensionLoader(IDependenciesFolder dependenciesFolder, IAssemblyProbingFolder assemblyProbingFolder, IVirtualPathProvider virtualPathProvider, IVirtualPathMonitor virtualPathMonitor) {
public PrecompiledExtensionLoader(IDependenciesFolder dependenciesFolder,
IAssemblyProbingFolder assemblyProbingFolder,
IVirtualPathProvider virtualPathProvider,
IVirtualPathMonitor virtualPathMonitor)
: base(dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
_assemblyProbingFolder = assemblyProbingFolder;
_virtualPathProvider = virtualPathProvider;
@@ -101,23 +106,18 @@ namespace Orchard.Environment.Extensions.Loaders {
};
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
var assembly = _assemblyProbingFolder.LoadAssembly(descriptor.Name);
if (assembly == null)
return null;
var assembly = _assemblyProbingFolder.LoadAssembly(descriptor.Name);
if (assembly == null)
return null;
Logger.Information("Loading extension \"{0}\"", descriptor.Name);
Logger.Information("Loading extension \"{0}\"", dependency.Name);
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
public string GetAssemblyPath(ExtensionDescriptor descriptor) {

View File

@@ -13,7 +13,9 @@ namespace Orchard.Environment.Extensions.Loaders {
private readonly IDependenciesFolder _dependenciesFolder;
private readonly IAssemblyProbingFolder _assemblyProbingFolder;
public ProbingExtensionLoader(IDependenciesFolder dependenciesFolder, IAssemblyProbingFolder assemblyProbingFolder) {
public ProbingExtensionLoader(IDependenciesFolder dependenciesFolder, IAssemblyProbingFolder assemblyProbingFolder)
: base(dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
_assemblyProbingFolder = assemblyProbingFolder;
Logger = NullLogger.Instance;
@@ -64,30 +66,25 @@ namespace Orchard.Environment.Extensions.Loaders {
return null;
return new ExtensionProbeEntry {
Descriptor = descriptor,
LastModificationTimeUtc = _assemblyProbingFolder.GetAssemblyDateTimeUtc(descriptor.Name),
Loader = this,
VirtualPath = desc.VirtualPath
};
Descriptor = descriptor,
LastModificationTimeUtc = _assemblyProbingFolder.GetAssemblyDateTimeUtc(descriptor.Name),
Loader = this,
VirtualPath = desc.VirtualPath
};
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
var assembly = _assemblyProbingFolder.LoadAssembly(descriptor.Name);
if (assembly == null)
return null;
var assembly = _assemblyProbingFolder.LoadAssembly(descriptor.Name);
if (assembly == null)
return null;
Logger.Information("Loading extension \"{0}\"", descriptor.Name);
Logger.Information("Loading extension \"{0}\"", dependency.Name);
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
}
}

View File

@@ -16,7 +16,9 @@ namespace Orchard.Environment.Extensions.Loaders {
private readonly IDependenciesFolder _dependenciesFolder;
private readonly IVirtualPathProvider _virtualPathProvider;
public ReferencedExtensionLoader(IDependenciesFolder dependenciesFolder, IVirtualPathProvider virtualPathProvider) {
public ReferencedExtensionLoader(IDependenciesFolder dependenciesFolder, IVirtualPathProvider virtualPathProvider)
: base(dependenciesFolder) {
_dependenciesFolder = dependenciesFolder;
_virtualPathProvider = virtualPathProvider;
Logger = NullLogger.Instance;
@@ -52,29 +54,24 @@ namespace Orchard.Environment.Extensions.Loaders {
};
}
public override ExtensionEntry Load(ExtensionDescriptor descriptor) {
public override ExtensionEntry LoadWorker(ExtensionDescriptor descriptor) {
if (HostingEnvironment.IsHosted == false)
return null;
var dependency = _dependenciesFolder.GetDescriptor(descriptor.Name);
if (dependency != null && dependency.LoaderName == this.Name) {
var assembly = BuildManager.GetReferencedAssemblies()
.OfType<Assembly>()
.FirstOrDefault(x => x.GetName().Name == descriptor.Name);
var assembly = BuildManager.GetReferencedAssemblies()
.OfType<Assembly>()
.FirstOrDefault(x => x.GetName().Name == descriptor.Name);
if (assembly == null)
return null;
if (assembly == null)
return null;
Logger.Information("Loading extension \"{0}\"", descriptor.Name);
Logger.Information("Loading extension \"{0}\"", dependency.Name);
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
return null;
return new ExtensionEntry {
Descriptor = descriptor,
Assembly = assembly,
ExportedTypes = assembly.GetExportedTypes()
};
}
}
}