2010-04-24 06:10:47 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Web;
|
|
|
|
|
using Orchard.Environment.Extensions;
|
2010-04-28 02:24:06 +08:00
|
|
|
|
using Orchard.Environment.Extensions.Models;
|
2010-04-29 02:47:29 +08:00
|
|
|
|
using Orchard.Environment.Topology;
|
|
|
|
|
using Orchard.Environment.Topology.Models;
|
2010-05-19 01:04:14 +08:00
|
|
|
|
using Orchard.Localization;
|
2010-04-24 06:10:47 +08:00
|
|
|
|
using Orchard.Modules.Models;
|
2010-05-19 01:04:14 +08:00
|
|
|
|
using Orchard.UI.Notify;
|
2010-04-24 06:10:47 +08:00
|
|
|
|
|
|
|
|
|
namespace Orchard.Modules.Services {
|
|
|
|
|
public class ModuleService : IModuleService {
|
2010-04-28 02:24:06 +08:00
|
|
|
|
private const string ModuleExtensionType = "module";
|
2010-04-24 06:10:47 +08:00
|
|
|
|
private readonly IExtensionManager _extensionManager;
|
2010-04-29 02:47:29 +08:00
|
|
|
|
private readonly IShellDescriptorManager _shellDescriptorManager;
|
2010-04-24 06:10:47 +08:00
|
|
|
|
|
2010-05-19 01:04:14 +08:00
|
|
|
|
public ModuleService(IOrchardServices orchardServices,IExtensionManager extensionManager, IShellDescriptorManager shellDescriptorManager) {
|
|
|
|
|
Services = orchardServices;
|
2010-04-24 06:10:47 +08:00
|
|
|
|
_extensionManager = extensionManager;
|
2010-04-29 02:47:29 +08:00
|
|
|
|
_shellDescriptorManager = shellDescriptorManager;
|
2010-05-19 01:04:14 +08:00
|
|
|
|
T = NullLocalizer.Instance;
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
2010-05-19 01:04:14 +08:00
|
|
|
|
private Localizer T { get; set; }
|
|
|
|
|
public IOrchardServices Services { get; set; }
|
|
|
|
|
|
2010-04-24 06:10:47 +08:00
|
|
|
|
public IModule GetModuleByName(string moduleName) {
|
2010-04-29 02:47:29 +08:00
|
|
|
|
return _extensionManager.AvailableExtensions().Where(e => string.Equals(e.Name, moduleName, StringComparison.OrdinalIgnoreCase) && string.Equals(e.ExtensionType, ModuleExtensionType, StringComparison.OrdinalIgnoreCase)).Select(
|
2010-04-28 02:24:06 +08:00
|
|
|
|
descriptor => AssembleModuleFromDescriptor(descriptor)).FirstOrDefault();
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IEnumerable<IModule> GetInstalledModules() {
|
|
|
|
|
return
|
|
|
|
|
_extensionManager.AvailableExtensions().Where(
|
2010-04-28 02:24:06 +08:00
|
|
|
|
e => String.Equals(e.ExtensionType, ModuleExtensionType, StringComparison.OrdinalIgnoreCase)).Select(
|
|
|
|
|
descriptor => AssembleModuleFromDescriptor(descriptor));
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void InstallModule(HttpPostedFileBase file) {
|
2010-04-28 02:24:06 +08:00
|
|
|
|
_extensionManager.InstallExtension(ModuleExtensionType, file);
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UninstallModule(string moduleName) {
|
2010-04-28 02:24:06 +08:00
|
|
|
|
_extensionManager.UninstallExtension(ModuleExtensionType, moduleName);
|
|
|
|
|
}
|
|
|
|
|
|
2010-04-29 02:47:29 +08:00
|
|
|
|
public IModule GetModuleByFeatureName(string featureName) {
|
2010-04-28 02:24:06 +08:00
|
|
|
|
return GetInstalledModules()
|
2010-04-29 02:47:29 +08:00
|
|
|
|
.Where(
|
|
|
|
|
m =>
|
|
|
|
|
m.Features.FirstOrDefault(f => string.Equals(f.Name, featureName, StringComparison.OrdinalIgnoreCase)) !=
|
|
|
|
|
null).FirstOrDefault();
|
2010-04-28 02:24:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
2010-04-29 02:47:29 +08:00
|
|
|
|
public IEnumerable<IModuleFeature> GetAvailableFeatures() {
|
2010-05-18 00:50:36 +08:00
|
|
|
|
var enabledFeatures = _shellDescriptorManager.GetShellDescriptor().EnabledFeatures;
|
2010-04-29 02:47:29 +08:00
|
|
|
|
return GetInstalledModules()
|
|
|
|
|
.SelectMany(m => _extensionManager.LoadFeatures(m.Features))
|
2010-05-18 00:50:36 +08:00
|
|
|
|
.Select(f => AssembleModuleFromDescriptor(f, enabledFeatures.FirstOrDefault(sf => string.Equals(sf.Name, f.Descriptor.Name, StringComparison.OrdinalIgnoreCase)) != null));
|
2010-04-29 02:47:29 +08:00
|
|
|
|
}
|
2010-04-28 02:24:06 +08:00
|
|
|
|
|
2010-04-29 02:47:29 +08:00
|
|
|
|
public IEnumerable<Feature> GetAvailableFeaturesByModule(string moduleName) {
|
|
|
|
|
throw new NotImplementedException();
|
2010-04-28 02:24:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void EnableFeatures(IEnumerable<string> featureNames) {
|
2010-04-29 02:47:29 +08:00
|
|
|
|
var shellDescriptor = _shellDescriptorManager.GetShellDescriptor();
|
2010-05-19 01:04:14 +08:00
|
|
|
|
var enabledFeatures = shellDescriptor.EnabledFeatures.ToList();
|
|
|
|
|
var features = GetAvailableFeatures().ToList();
|
2010-04-29 02:47:29 +08:00
|
|
|
|
|
2010-05-19 01:04:14 +08:00
|
|
|
|
foreach (var name in featureNames) {
|
|
|
|
|
var featureName = name;
|
|
|
|
|
var feature = features.Single(f => f.Descriptor.Name == featureName);
|
|
|
|
|
var sleepingDependencies =
|
|
|
|
|
feature.Descriptor.Dependencies.Where(s => enabledFeatures.FirstOrDefault(sf => sf.Name == s) == null);
|
|
|
|
|
|
|
|
|
|
if (sleepingDependencies.Count() != 0) {
|
|
|
|
|
Services.Notifier.Warning(T(
|
|
|
|
|
"If you want to enable {0}, then you'll also need {1} (and I won't let you flip everything on in one go yet).",
|
|
|
|
|
featureName,
|
|
|
|
|
sleepingDependencies.Count() > 1
|
|
|
|
|
? string.Join("",
|
|
|
|
|
sleepingDependencies.Select(
|
|
|
|
|
(s, i) =>
|
|
|
|
|
i == sleepingDependencies.Count() - 2
|
|
|
|
|
? T("{0} and ", s).ToString()
|
|
|
|
|
: T("{0}, ", s).ToString()).ToArray())
|
|
|
|
|
: sleepingDependencies.First()));
|
|
|
|
|
} else if (enabledFeatures.FirstOrDefault(f => f.Name == featureName) == null) {
|
|
|
|
|
enabledFeatures.Add(new ShellFeature {Name = featureName});
|
|
|
|
|
Services.Notifier.Information(T("{0} was enabled", featureName));
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-04-29 02:47:29 +08:00
|
|
|
|
|
|
|
|
|
_shellDescriptorManager.UpdateShellDescriptor(shellDescriptor.SerialNumber, enabledFeatures, shellDescriptor.Parameters);
|
2010-04-28 02:24:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void DisableFeatures(IEnumerable<string> featureNames) {
|
2010-04-29 02:47:29 +08:00
|
|
|
|
var shellDescriptor = _shellDescriptorManager.GetShellDescriptor();
|
|
|
|
|
var enabledFeatures = shellDescriptor.EnabledFeatures.ToList();
|
2010-05-18 00:50:36 +08:00
|
|
|
|
var features = GetAvailableFeatures().ToList();
|
2010-05-15 06:52:22 +08:00
|
|
|
|
|
2010-05-19 01:04:14 +08:00
|
|
|
|
foreach (var name in featureNames) {
|
|
|
|
|
var featureName = name;
|
|
|
|
|
var dependants = features.Where(f => f.IsEnabled && f.Descriptor.Dependencies != null && f.Descriptor.Dependencies.Contains(featureName));
|
|
|
|
|
|
|
|
|
|
if (dependants.Count() != 0) {
|
|
|
|
|
Services.Notifier.Warning(T(
|
|
|
|
|
"If you want to disable {0}, then you'll also lose {1} (and I won't let you do that yet).",
|
|
|
|
|
featureName,
|
|
|
|
|
dependants.Count() > 0
|
|
|
|
|
? string.Join("",
|
|
|
|
|
dependants.Select(
|
|
|
|
|
(f, i) =>
|
|
|
|
|
i == dependants.Count() - 2
|
|
|
|
|
? T("{0} and ", f.Descriptor.Name).ToString()
|
|
|
|
|
: T("{0}, ", f.Descriptor.Name).ToString()).ToArray())
|
|
|
|
|
: dependants.First().Descriptor.Name));
|
2010-05-15 06:52:22 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
2010-05-19 01:04:14 +08:00
|
|
|
|
enabledFeatures.RemoveAll(f => f.Name == featureName);
|
|
|
|
|
Services.Notifier.Information(T("{0} was disabled", featureName));
|
2010-05-15 06:52:22 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2010-04-29 02:47:29 +08:00
|
|
|
|
|
|
|
|
|
_shellDescriptorManager.UpdateShellDescriptor(shellDescriptor.SerialNumber, enabledFeatures, shellDescriptor.Parameters);
|
2010-04-28 02:24:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static IModule AssembleModuleFromDescriptor(ExtensionDescriptor extensionDescriptor) {
|
|
|
|
|
return new Module {
|
|
|
|
|
ModuleName = extensionDescriptor.Name,
|
|
|
|
|
DisplayName = extensionDescriptor.DisplayName,
|
|
|
|
|
Description = extensionDescriptor.Description,
|
|
|
|
|
Version = extensionDescriptor.Version,
|
|
|
|
|
Author = extensionDescriptor.Author,
|
|
|
|
|
HomePage = extensionDescriptor.WebSite,
|
|
|
|
|
Tags = extensionDescriptor.Tags,
|
|
|
|
|
Features = extensionDescriptor.Features
|
|
|
|
|
};
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
2010-04-29 02:47:29 +08:00
|
|
|
|
|
|
|
|
|
private static IModuleFeature AssembleModuleFromDescriptor(Feature feature, bool isEnabled) {
|
|
|
|
|
return new ModuleFeature {
|
|
|
|
|
Descriptor = feature.Descriptor,
|
|
|
|
|
IsEnabled = isEnabled
|
|
|
|
|
};
|
|
|
|
|
}
|
2010-04-24 06:10:47 +08:00
|
|
|
|
}
|
|
|
|
|
}
|