mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-03 03:58:13 +08:00
#18288: Displaying an error message when a manifest could not be loaded
Work Item: 18288 --HG-- branch : 1.x
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" +
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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)));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user