#18288: Displaying an error message when a manifest could not be loaded

Work Item: 18288

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2011-12-28 11:22:20 -08:00
parent fa2aaf22d2
commit 331c2155f8
8 changed files with 47 additions and 25 deletions

View File

@@ -1,4 +1,3 @@
using System.Collections.Concurrent;
using System.Linq;
using System.Collections.Generic;
@@ -14,7 +13,7 @@ using Orchard.Logging;
using Orchard.Utility.Extensions;
namespace Orchard.Environment {
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler, ICriticalErrorProvider {
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler {
private readonly IHostLocalRestart _hostLocalRestart;
private readonly IShellSettingsManager _shellSettingsManager;
private readonly IShellContextFactory _shellContextFactory;
@@ -23,7 +22,6 @@ namespace Orchard.Environment {
private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator;
private readonly IExtensionMonitoringCoordinator _extensionMonitoringCoordinator;
private readonly ICacheManager _cacheManager;
private readonly ConcurrentBag<LocalizedString> _errorMessages;
private readonly object _syncLock = new object();
private IEnumerable<ShellContext> _shellContexts;
@@ -47,7 +45,6 @@ namespace Orchard.Environment {
_cacheManager = cacheManager;
_hostLocalRestart = hostLocalRestart;
_tenantsToRestart = Enumerable.Empty<ShellSettings>();
_errorMessages = new ConcurrentBag<LocalizedString>();
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
@@ -60,12 +57,6 @@ namespace Orchard.Environment {
get { return BuildCurrent().ToReadOnlyCollection(); }
}
public void RegisterErrorMessage(LocalizedString message) {
if (_errorMessages != null && _errorMessages.All(m => m.TextHint != message.TextHint)) {
_errorMessages.Add(message);
}
}
public ShellContext GetShellContext(ShellSettings shellSettings) {
return Current
.Single(shellContext => shellContext.Settings.Name.Equals(shellSettings.Name));
@@ -294,9 +285,5 @@ namespace Orchard.Environment {
_tenantsToRestart = _tenantsToRestart.Union(new[] { context.Settings });
}
}
public IEnumerable<LocalizedString> GetErrors() {
return _errorMessages;
}
}
}

View File

@@ -19,7 +19,7 @@ namespace Orchard.Environment.Extensions.Compilers {
private readonly IDependenciesFolder _dependenciesFolder;
private readonly IEnumerable<IExtensionLoader> _loaders;
private readonly IAssemblyLoader _assemblyLoader;
private readonly IOrchardHost _orchardHost;
private readonly ICriticalErrorProvider _criticalErrorProvider;
public DefaultExtensionCompiler(
IVirtualPathProvider virtualPathProvider,
@@ -27,14 +27,14 @@ namespace Orchard.Environment.Extensions.Compilers {
IDependenciesFolder dependenciesFolder,
IEnumerable<IExtensionLoader> loaders,
IAssemblyLoader assemblyLoader,
IOrchardHost orchardHost) {
ICriticalErrorProvider criticalErrorProvider) {
_virtualPathProvider = virtualPathProvider;
_projectFileParser = projectFileParser;
_dependenciesFolder = dependenciesFolder;
_loaders = loaders;
_assemblyLoader = assemblyLoader;
_orchardHost = orchardHost;
_criticalErrorProvider = criticalErrorProvider;
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
@@ -91,7 +91,7 @@ namespace Orchard.Environment.Extensions.Compilers {
}
else {
Logger.Error("Assembly reference '{0}' for project '{1}' cannot be loaded", assemblyReference.FullName, context.VirtualPath);
_orchardHost.RegisterErrorMessage(T(
_criticalErrorProvider.RegisterErrorMessage(T(
"The assembly reference '{0}' could not be loaded.\r\n\r\n" +
"There are generally a few ways to solve this issue:\r\n" +
"1. Install any dependent module.\r\n" +

View File

@@ -0,0 +1,26 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using Orchard.Localization;
namespace Orchard.Environment.Extensions {
public class DefaultCriticalErrorProvider : ICriticalErrorProvider {
private readonly ConcurrentBag<LocalizedString> _errorMessages;
public DefaultCriticalErrorProvider() {
_errorMessages = new ConcurrentBag<LocalizedString>();
}
public IEnumerable<LocalizedString> GetErrors() {
return _errorMessages;
}
public void RegisterErrorMessage(LocalizedString message) {
if (_errorMessages != null && _errorMessages.All(m => m.TextHint != message.TextHint)) {
_errorMessages.Add(message);
}
}
}
}

View File

@@ -31,10 +31,12 @@ namespace Orchard.Environment.Extensions.Folders {
private readonly ICacheManager _cacheManager;
private readonly IWebSiteFolder _webSiteFolder;
private readonly ICriticalErrorProvider _criticalErrorProvider;
public ExtensionHarvester(ICacheManager cacheManager, IWebSiteFolder webSiteFolder) {
public ExtensionHarvester(ICacheManager cacheManager, IWebSiteFolder webSiteFolder, ICriticalErrorProvider criticalErrorProvider) {
_cacheManager = cacheManager;
_webSiteFolder = webSiteFolder;
_criticalErrorProvider = criticalErrorProvider;
Logger = NullLogger.Instance;
T = NullLocalizer.Instance;
}
@@ -74,6 +76,9 @@ namespace Orchard.Environment.Extensions.Folders {
Logger.Error("The module '{0}' could not be loaded because it has an invalid Path ({1}). It was ignored. The Path if specified must be a valid URL segment. The best bet is to stick with letters and numbers with no spaces.",
extensionId,
descriptor.Path);
_criticalErrorProvider.RegisterErrorMessage(T("The extension '{0}' could not be loaded because it has an invalid Path ({1}). It was ignored. The Path if specified must be a valid URL segment. The best bet is to stick with letters and numbers with no spaces.",
extensionId,
descriptor.Path));
continue;
}
@@ -88,6 +93,7 @@ namespace Orchard.Environment.Extensions.Folders {
catch (Exception ex) {
// Ignore invalid module manifests
Logger.Error(ex, "The module '{0}' could not be loaded. It was ignored.", extensionId);
_criticalErrorProvider.RegisterErrorMessage(T("The extension '{0}' manifest could not be loaded. It was ignored.", extensionId));
}
}
Logger.Information("Done looking for extensions in '{0}': {1}", path, string.Join(", ", localList.Select(d => d.Id)));

View File

@@ -4,5 +4,10 @@ using Orchard.Localization;
namespace Orchard.Environment.Extensions {
public interface ICriticalErrorProvider {
IEnumerable<LocalizedString> GetErrors();
/// <summary>
/// Called by any to notice the system of a critical issue at the system level, e.g. incorrect extensions
/// </summary>
void RegisterErrorMessage(LocalizedString message);
}
}

View File

@@ -25,11 +25,6 @@ namespace Orchard.Environment {
/// </summary>
void EndRequest();
/// <summary>
/// Called by any to notice the system of a critical issue at the system level, e.g. incorrect extensions
/// </summary>
void RegisterErrorMessage(LocalizedString message);
ShellContext GetShellContext(ShellSettings shellSettings);
/// <summary>

View File

@@ -60,6 +60,7 @@ namespace Orchard.Environment {
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
builder.RegisterType<ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();
builder.RegisterType<DefaultExceptionPolicy>().As<IExceptionPolicy>().SingleInstance();
builder.RegisterType<DefaultCriticalErrorProvider>().As<ICriticalErrorProvider>().SingleInstance();
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
RegisterVolatileProvider<AppDataFolder, IAppDataFolder>(builder);
@@ -70,8 +71,9 @@ namespace Orchard.Environment {
RegisterVolatileProvider<DefaultAssemblyProbingFolder, IAssemblyProbingFolder>(builder);
RegisterVolatileProvider<DefaultVirtualPathMonitor, IVirtualPathMonitor>(builder);
RegisterVolatileProvider<DefaultVirtualPathProvider, IVirtualPathProvider>(builder);
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().As<IEventHandler>().As<ICriticalErrorProvider>().SingleInstance();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().As<IEventHandler>().SingleInstance();
{
builder.RegisterType<ShellSettingsManager>().As<IShellSettingsManager>().SingleInstance();

View File

@@ -207,6 +207,7 @@
<Compile Include="Environment\CollectionOrderModule.cs" />
<Compile Include="Caching\DefaultAsyncTokenProvider.cs" />
<Compile Include="Environment\Configuration\ShellSettingsSerializer.cs" />
<Compile Include="Environment\Extensions\DefaultCriticalErrorProvider.cs" />
<Compile Include="Environment\Extensions\ExtensionMonitoringCoordinator.cs" />
<Compile Include="Caching\IAsyncTokenProvider.cs" />
<Compile Include="Environment\Extensions\Folders\CoreModuleFolders.cs" />