Fix bug in dynamic extension loader

When probing for references, if the reference is present in the module "bin"
directory, then make sure the virtual path of the reference entry is set.

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-07-18 14:34:12 -07:00
parent dfaab61f43
commit 1b020c6c8a
4 changed files with 29 additions and 15 deletions
@@ -104,18 +104,23 @@ namespace Orchard.Environment.Extensions {
context.AvailableExtensions context.AvailableExtensions
.Where(e => .Where(e =>
context.ReferencesByModule.ContainsKey(extension.Name) && context.ReferencesByModule.ContainsKey(extension.Name) &&
context.ReferencesByModule[extension.Name].Any(r => StringComparer.OrdinalIgnoreCase.Equals(e.Name, r.Name))); context.ReferencesByModule[extension.Name].Any(r => StringComparer.OrdinalIgnoreCase.Equals(e.Name, r.Name)))
.ToList();
var processedModuleReferences = var processedModuleReferences =
moduleReferences moduleReferences
.Where(e => context.ProcessedExtensions.ContainsKey(e.Name)) .Where(e => context.ProcessedExtensions.ContainsKey(e.Name))
.Select(e => context.ProcessedExtensions[e.Name]); .Select(e => context.ProcessedExtensions[e.Name])
.ToList();
var activatedExtension = extensionProbes var activatedExtension = extensionProbes
.Where(e => e.Loader.IsCompatibleWithModuleReferences(extension, processedModuleReferences)) .Where(e => e.Loader.IsCompatibleWithModuleReferences(extension, processedModuleReferences))
.FirstOrDefault(); .FirstOrDefault();
var previousDependency = context.PreviousDependencies.Where(d => StringComparer.OrdinalIgnoreCase.Equals(d.Name, extension.Name)).FirstOrDefault(); var previousDependency = context
.PreviousDependencies
.Where(d => StringComparer.OrdinalIgnoreCase.Equals(d.Name, extension.Name))
.FirstOrDefault();
if (activatedExtension == null) { if (activatedExtension == null) {
Logger.Warning("No loader found for extension \"{0}\"!", extension.Name); Logger.Warning("No loader found for extension \"{0}\"!", extension.Name);
@@ -233,8 +238,10 @@ namespace Orchard.Environment.Extensions {
var bestBinaryReference = references var bestBinaryReference = references
.Where(entry => !string.IsNullOrEmpty(entry.VirtualPath)) .Where(entry => !string.IsNullOrEmpty(entry.VirtualPath))
.Select(entry => new { Entry = entry, LastWriteTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(entry.VirtualPath) })
.OrderBy(e => e.LastWriteTimeUtc) .OrderBy(e => e.LastWriteTimeUtc)
.ThenBy(e => e.Name).FirstOrDefault(); .ThenBy(e => e.Entry.Name)
.FirstOrDefault();
var bestExtensionReference = context.ProcessedExtensions.ContainsKey(referenceName) ? var bestExtensionReference = context.ProcessedExtensions.ContainsKey(referenceName) ?
context.ProcessedExtensions[referenceName] : context.ProcessedExtensions[referenceName] :
@@ -252,14 +259,14 @@ namespace Orchard.Environment.Extensions {
// Activate the binary ref // Activate the binary ref
if (bestBinaryReference != null) { if (bestBinaryReference != null) {
if (!context.ProcessedReferences.Contains(bestBinaryReference.Name)) { if (!context.ProcessedReferences.Contains(bestBinaryReference.Entry.Name)) {
context.ProcessedReferences.Add(bestBinaryReference.Name); context.ProcessedReferences.Add(bestBinaryReference.Entry.Name);
bestBinaryReference.Loader.ReferenceActivated(context, bestBinaryReference); bestBinaryReference.Entry.Loader.ReferenceActivated(context, bestBinaryReference.Entry);
} }
activatedReferences.Add(new DependencyReferenceDescriptor { activatedReferences.Add(new DependencyReferenceDescriptor {
LoaderName = bestBinaryReference.Loader.Name, LoaderName = bestBinaryReference.Entry.Loader.Name,
Name = bestBinaryReference.Name, Name = bestBinaryReference.Entry.Name,
VirtualPath = bestBinaryReference.VirtualPath VirtualPath = bestBinaryReference.Entry.VirtualPath
}); });
return; return;
} }
@@ -105,11 +105,19 @@ namespace Orchard.Environment.Extensions.Loaders {
Descriptor = descriptor, Descriptor = descriptor,
Loader = this, Loader = this,
Name = r.AssemblyName, Name = r.AssemblyName,
VirtualPath = null VirtualPath = GetReferenceVirtualPath(projectPath, r.AssemblyName)
}); });
} }
} }
private string GetReferenceVirtualPath(string projectPath, string referenceName) {
var path = _virtualPathProvider.GetDirectoryName(projectPath);
path = _virtualPathProvider.Combine(path, "bin", referenceName + ".dll");
if (_virtualPathProvider.FileExists(path))
return path;
return null;
}
public override Assembly LoadReference(DependencyReferenceDescriptor reference) { public override Assembly LoadReference(DependencyReferenceDescriptor reference) {
return _buildManager.GetCompiledAssembly(reference.VirtualPath); return _buildManager.GetCompiledAssembly(reference.VirtualPath);
} }
@@ -18,7 +18,6 @@ namespace Orchard.Environment.Extensions.Loaders {
public IExtensionLoader Loader { get; set; } public IExtensionLoader Loader { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string VirtualPath { get; set; } public string VirtualPath { get; set; }
public DateTime LastWriteTimeUtc { get; set; }
} }
public interface IExtensionLoader { public interface IExtensionLoader {
@@ -141,9 +141,9 @@ namespace Orchard.Environment.Extensions.Loaders {
Descriptor = descriptor, Descriptor = descriptor,
Loader = this, Loader = this,
Name = Path.GetFileNameWithoutExtension(path), Name = Path.GetFileNameWithoutExtension(path),
VirtualPath = path, VirtualPath = path
LastWriteTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(path) } )
} ); .ToList();
} }
public override bool IsCompatibleWithModuleReferences(ExtensionDescriptor extension, IEnumerable<ExtensionProbeEntry> references) { public override bool IsCompatibleWithModuleReferences(ExtensionDescriptor extension, IEnumerable<ExtensionProbeEntry> references) {