using System.Reflection; using System.Text; using Newtonsoft.Json; using Nop.Core; using Nop.Core.Infrastructure; namespace Nop.Services.Plugins; /// /// Represents a plugin descriptor /// public partial class PluginDescriptor : PluginDescriptorBaseInfo, IDescriptor, IComparable { #region Ctor public PluginDescriptor() { SupportedVersions = new List(); LimitedToStores = new List(); LimitedToCustomerRoles = new List(); DependsOn = new List(); } #endregion #region Methods /// /// Get plugin descriptor from the description text /// /// Description text /// Plugin descriptor public static PluginDescriptor GetPluginDescriptorFromText(string text) { if (string.IsNullOrEmpty(text)) return new PluginDescriptor(); //get plugin descriptor from the JSON file var descriptor = JsonConvert.DeserializeObject(text); //nopCommerce 2.00 didn't have 'SupportedVersions' parameter, so let's set it to "2.00" if (!descriptor.SupportedVersions.Any()) descriptor.SupportedVersions.Add("2.00"); return descriptor; } /// /// Get the instance of the plugin /// /// Type of the plugin /// Plugin instance public virtual TPlugin Instance() where TPlugin : class, IPlugin { //try to resolve plugin as unregistered service var instance = EngineContext.Current.ResolveUnregistered(PluginType); //try to get typed instance var typedInstance = instance as TPlugin; if (typedInstance != null) typedInstance.PluginDescriptor = this; return typedInstance; } /// /// Compares this instance with a specified PluginDescriptor object /// /// The PluginDescriptor to compare with this instance /// An integer that indicates whether this instance precedes, follows, or appears in the same position in the sort order as the specified parameter public int CompareTo(PluginDescriptor other) { if (DisplayOrder != other.DisplayOrder) return DisplayOrder.CompareTo(other.DisplayOrder); return string.Compare(SystemName, other.SystemName, StringComparison.InvariantCultureIgnoreCase); } /// /// Returns the plugin as a string /// /// Value of the FriendlyName public override string ToString() { return FriendlyName; } /// /// Save plugin descriptor to the plugin description file /// public virtual void Save() { //since plugins are loaded before IoC initialization using the default provider, //in order to avoid possible problems we use CommonHelper.DefaultFileProvider //instead of the main file provider var fileProvider = CommonHelper.DefaultFileProvider; //get the description file path if (OriginalAssemblyFile == null) throw new Exception($"Cannot load original assembly path for {SystemName} plugin."); var filePath = fileProvider.Combine(fileProvider.GetDirectoryName(OriginalAssemblyFile), NopPluginDefaults.DescriptionFileName); if (!fileProvider.FileExists(filePath)) throw new Exception($"Description file for {SystemName} plugin does not exist. {filePath}"); //save the file var text = JsonConvert.SerializeObject(this, Formatting.Indented); fileProvider.WriteAllText(filePath, text, Encoding.UTF8); } #endregion #region Properties /// /// Gets or sets the plugin group /// [JsonProperty(PropertyName = "Group")] public virtual string Group { get; set; } /// /// Gets or sets the plugin friendly name /// [JsonProperty(PropertyName = "FriendlyName")] public virtual string FriendlyName { get; set; } /// /// Gets or sets the supported versions of nopCommerce /// [JsonProperty(PropertyName = "SupportedVersions")] public virtual IList SupportedVersions { get; set; } /// /// Gets or sets the author /// [JsonProperty(PropertyName = "Author")] public virtual string Author { get; set; } /// /// Gets or sets the display order /// [JsonProperty(PropertyName = "DisplayOrder")] public virtual int DisplayOrder { get; set; } /// /// Gets or sets the name of the assembly file /// [JsonProperty(PropertyName = "FileName")] public virtual string AssemblyFileName { get; set; } /// /// Gets or sets the description /// [JsonProperty(PropertyName = "Description")] public virtual string Description { get; set; } /// /// Gets or sets the list of store identifiers in which this plugin is available. If empty, then this plugin is available in all stores /// [JsonProperty(PropertyName = "LimitedToStores")] public virtual IList LimitedToStores { get; set; } /// /// Gets or sets the list of customer role identifiers for which this plugin is available. If empty, then this plugin is available for all ones. /// [JsonProperty(PropertyName = "LimitedToCustomerRoles")] public virtual IList LimitedToCustomerRoles { get; set; } /// /// Gets or sets the list of plugins' system name that this plugin depends on /// [JsonProperty(PropertyName = "DependsOnSystemNames")] public virtual IList DependsOn { get; set; } /// /// Gets or sets the value indicating whether plugin is installed /// [JsonIgnore] public virtual bool Installed { get; set; } /// /// Gets or sets the plugin type /// [JsonIgnore] public virtual Type PluginType { get; set; } /// /// Gets or sets the original assembly file /// [JsonIgnore] public virtual string OriginalAssemblyFile { get; set; } /// /// Gets or sets the list of all library files in the plugin directory /// [JsonIgnore] public virtual IList PluginFiles { get; set; } /// /// Gets or sets the assembly that is active in the application /// [JsonIgnore] public virtual Assembly ReferencedAssembly { get; set; } /// /// Gets or sets the value indicating whether need to show the plugin on plugins page /// [JsonIgnore] public virtual bool ShowInPluginsList { get; set; } = true; #endregion }