mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +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.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
@@ -14,7 +13,7 @@ using Orchard.Logging;
|
|||||||
using Orchard.Utility.Extensions;
|
using Orchard.Utility.Extensions;
|
||||||
|
|
||||||
namespace Orchard.Environment {
|
namespace Orchard.Environment {
|
||||||
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler, ICriticalErrorProvider {
|
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler {
|
||||||
private readonly IHostLocalRestart _hostLocalRestart;
|
private readonly IHostLocalRestart _hostLocalRestart;
|
||||||
private readonly IShellSettingsManager _shellSettingsManager;
|
private readonly IShellSettingsManager _shellSettingsManager;
|
||||||
private readonly IShellContextFactory _shellContextFactory;
|
private readonly IShellContextFactory _shellContextFactory;
|
||||||
@@ -23,7 +22,6 @@ namespace Orchard.Environment {
|
|||||||
private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator;
|
private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator;
|
||||||
private readonly IExtensionMonitoringCoordinator _extensionMonitoringCoordinator;
|
private readonly IExtensionMonitoringCoordinator _extensionMonitoringCoordinator;
|
||||||
private readonly ICacheManager _cacheManager;
|
private readonly ICacheManager _cacheManager;
|
||||||
private readonly ConcurrentBag<LocalizedString> _errorMessages;
|
|
||||||
private readonly object _syncLock = new object();
|
private readonly object _syncLock = new object();
|
||||||
|
|
||||||
private IEnumerable<ShellContext> _shellContexts;
|
private IEnumerable<ShellContext> _shellContexts;
|
||||||
@@ -47,7 +45,6 @@ namespace Orchard.Environment {
|
|||||||
_cacheManager = cacheManager;
|
_cacheManager = cacheManager;
|
||||||
_hostLocalRestart = hostLocalRestart;
|
_hostLocalRestart = hostLocalRestart;
|
||||||
_tenantsToRestart = Enumerable.Empty<ShellSettings>();
|
_tenantsToRestart = Enumerable.Empty<ShellSettings>();
|
||||||
_errorMessages = new ConcurrentBag<LocalizedString>();
|
|
||||||
|
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
@@ -60,12 +57,6 @@ namespace Orchard.Environment {
|
|||||||
get { return BuildCurrent().ToReadOnlyCollection(); }
|
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) {
|
public ShellContext GetShellContext(ShellSettings shellSettings) {
|
||||||
return Current
|
return Current
|
||||||
.Single(shellContext => shellContext.Settings.Name.Equals(shellSettings.Name));
|
.Single(shellContext => shellContext.Settings.Name.Equals(shellSettings.Name));
|
||||||
@@ -294,9 +285,5 @@ namespace Orchard.Environment {
|
|||||||
_tenantsToRestart = _tenantsToRestart.Union(new[] { context.Settings });
|
_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 IDependenciesFolder _dependenciesFolder;
|
||||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||||
private readonly IAssemblyLoader _assemblyLoader;
|
private readonly IAssemblyLoader _assemblyLoader;
|
||||||
private readonly IOrchardHost _orchardHost;
|
private readonly ICriticalErrorProvider _criticalErrorProvider;
|
||||||
|
|
||||||
public DefaultExtensionCompiler(
|
public DefaultExtensionCompiler(
|
||||||
IVirtualPathProvider virtualPathProvider,
|
IVirtualPathProvider virtualPathProvider,
|
||||||
@@ -27,14 +27,14 @@ namespace Orchard.Environment.Extensions.Compilers {
|
|||||||
IDependenciesFolder dependenciesFolder,
|
IDependenciesFolder dependenciesFolder,
|
||||||
IEnumerable<IExtensionLoader> loaders,
|
IEnumerable<IExtensionLoader> loaders,
|
||||||
IAssemblyLoader assemblyLoader,
|
IAssemblyLoader assemblyLoader,
|
||||||
IOrchardHost orchardHost) {
|
ICriticalErrorProvider criticalErrorProvider) {
|
||||||
|
|
||||||
_virtualPathProvider = virtualPathProvider;
|
_virtualPathProvider = virtualPathProvider;
|
||||||
_projectFileParser = projectFileParser;
|
_projectFileParser = projectFileParser;
|
||||||
_dependenciesFolder = dependenciesFolder;
|
_dependenciesFolder = dependenciesFolder;
|
||||||
_loaders = loaders;
|
_loaders = loaders;
|
||||||
_assemblyLoader = assemblyLoader;
|
_assemblyLoader = assemblyLoader;
|
||||||
_orchardHost = orchardHost;
|
_criticalErrorProvider = criticalErrorProvider;
|
||||||
|
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
@@ -91,7 +91,7 @@ namespace Orchard.Environment.Extensions.Compilers {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Logger.Error("Assembly reference '{0}' for project '{1}' cannot be loaded", assemblyReference.FullName, context.VirtualPath);
|
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" +
|
"The assembly reference '{0}' could not be loaded.\r\n\r\n" +
|
||||||
"There are generally a few ways to solve this issue:\r\n" +
|
"There are generally a few ways to solve this issue:\r\n" +
|
||||||
"1. Install any dependent module.\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 ICacheManager _cacheManager;
|
||||||
private readonly IWebSiteFolder _webSiteFolder;
|
private readonly IWebSiteFolder _webSiteFolder;
|
||||||
|
private readonly ICriticalErrorProvider _criticalErrorProvider;
|
||||||
|
|
||||||
public ExtensionHarvester(ICacheManager cacheManager, IWebSiteFolder webSiteFolder) {
|
public ExtensionHarvester(ICacheManager cacheManager, IWebSiteFolder webSiteFolder, ICriticalErrorProvider criticalErrorProvider) {
|
||||||
_cacheManager = cacheManager;
|
_cacheManager = cacheManager;
|
||||||
_webSiteFolder = webSiteFolder;
|
_webSiteFolder = webSiteFolder;
|
||||||
|
_criticalErrorProvider = criticalErrorProvider;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
T = NullLocalizer.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.",
|
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,
|
extensionId,
|
||||||
descriptor.Path);
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,6 +93,7 @@ namespace Orchard.Environment.Extensions.Folders {
|
|||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
// Ignore invalid module manifests
|
// Ignore invalid module manifests
|
||||||
Logger.Error(ex, "The module '{0}' could not be loaded. It was ignored.", extensionId);
|
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)));
|
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 {
|
namespace Orchard.Environment.Extensions {
|
||||||
public interface ICriticalErrorProvider {
|
public interface ICriticalErrorProvider {
|
||||||
IEnumerable<LocalizedString> GetErrors();
|
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>
|
/// </summary>
|
||||||
void EndRequest();
|
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);
|
ShellContext GetShellContext(ShellSettings shellSettings);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ namespace Orchard.Environment {
|
|||||||
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
|
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
|
||||||
builder.RegisterType<ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();
|
builder.RegisterType<ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();
|
||||||
builder.RegisterType<DefaultExceptionPolicy>().As<IExceptionPolicy>().SingleInstance();
|
builder.RegisterType<DefaultExceptionPolicy>().As<IExceptionPolicy>().SingleInstance();
|
||||||
|
builder.RegisterType<DefaultCriticalErrorProvider>().As<ICriticalErrorProvider>().SingleInstance();
|
||||||
|
|
||||||
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
||||||
RegisterVolatileProvider<AppDataFolder, IAppDataFolder>(builder);
|
RegisterVolatileProvider<AppDataFolder, IAppDataFolder>(builder);
|
||||||
@@ -71,7 +72,8 @@ namespace Orchard.Environment {
|
|||||||
RegisterVolatileProvider<DefaultVirtualPathMonitor, IVirtualPathMonitor>(builder);
|
RegisterVolatileProvider<DefaultVirtualPathMonitor, IVirtualPathMonitor>(builder);
|
||||||
RegisterVolatileProvider<DefaultVirtualPathProvider, IVirtualPathProvider>(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();
|
builder.RegisterType<ShellSettingsManager>().As<IShellSettingsManager>().SingleInstance();
|
||||||
|
|
||||||
|
|||||||
@@ -207,6 +207,7 @@
|
|||||||
<Compile Include="Environment\CollectionOrderModule.cs" />
|
<Compile Include="Environment\CollectionOrderModule.cs" />
|
||||||
<Compile Include="Caching\DefaultAsyncTokenProvider.cs" />
|
<Compile Include="Caching\DefaultAsyncTokenProvider.cs" />
|
||||||
<Compile Include="Environment\Configuration\ShellSettingsSerializer.cs" />
|
<Compile Include="Environment\Configuration\ShellSettingsSerializer.cs" />
|
||||||
|
<Compile Include="Environment\Extensions\DefaultCriticalErrorProvider.cs" />
|
||||||
<Compile Include="Environment\Extensions\ExtensionMonitoringCoordinator.cs" />
|
<Compile Include="Environment\Extensions\ExtensionMonitoringCoordinator.cs" />
|
||||||
<Compile Include="Caching\IAsyncTokenProvider.cs" />
|
<Compile Include="Caching\IAsyncTokenProvider.cs" />
|
||||||
<Compile Include="Environment\Extensions\Folders\CoreModuleFolders.cs" />
|
<Compile Include="Environment\Extensions\Folders\CoreModuleFolders.cs" />
|
||||||
|
|||||||
Reference in New Issue
Block a user