212 lines
6.9 KiB
C#
212 lines
6.9 KiB
C#
using System.Reflection;
|
|
using System.Text;
|
|
using Newtonsoft.Json;
|
|
using Nop.Core;
|
|
using Nop.Core.Infrastructure;
|
|
|
|
namespace Nop.Services.Plugins;
|
|
|
|
/// <summary>
|
|
/// Represents a plugin descriptor
|
|
/// </summary>
|
|
public partial class PluginDescriptor : PluginDescriptorBaseInfo, IDescriptor, IComparable<PluginDescriptor>
|
|
{
|
|
#region Ctor
|
|
|
|
public PluginDescriptor()
|
|
{
|
|
SupportedVersions = new List<string>();
|
|
LimitedToStores = new List<int>();
|
|
LimitedToCustomerRoles = new List<int>();
|
|
DependsOn = new List<string>();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
/// <summary>
|
|
/// Get plugin descriptor from the description text
|
|
/// </summary>
|
|
/// <param name="text">Description text</param>
|
|
/// <returns>Plugin descriptor</returns>
|
|
public static PluginDescriptor GetPluginDescriptorFromText(string text)
|
|
{
|
|
if (string.IsNullOrEmpty(text))
|
|
return new PluginDescriptor();
|
|
|
|
//get plugin descriptor from the JSON file
|
|
var descriptor = JsonConvert.DeserializeObject<PluginDescriptor>(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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the instance of the plugin
|
|
/// </summary>
|
|
/// <typeparam name="TPlugin">Type of the plugin</typeparam>
|
|
/// <returns>Plugin instance</returns>
|
|
public virtual TPlugin Instance<TPlugin>() 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compares this instance with a specified PluginDescriptor object
|
|
/// </summary>
|
|
/// <param name="other">The PluginDescriptor to compare with this instance</param>
|
|
/// <returns>An integer that indicates whether this instance precedes, follows, or appears in the same position in the sort order as the specified parameter</returns>
|
|
public int CompareTo(PluginDescriptor other)
|
|
{
|
|
if (DisplayOrder != other.DisplayOrder)
|
|
return DisplayOrder.CompareTo(other.DisplayOrder);
|
|
|
|
return string.Compare(SystemName, other.SystemName, StringComparison.InvariantCultureIgnoreCase);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the plugin as a string
|
|
/// </summary>
|
|
/// <returns>Value of the FriendlyName</returns>
|
|
public override string ToString()
|
|
{
|
|
return FriendlyName;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Save plugin descriptor to the plugin description file
|
|
/// </summary>
|
|
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
|
|
|
|
/// <summary>
|
|
/// Gets or sets the plugin group
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "Group")]
|
|
public virtual string Group { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the plugin friendly name
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "FriendlyName")]
|
|
public virtual string FriendlyName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the supported versions of nopCommerce
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "SupportedVersions")]
|
|
public virtual IList<string> SupportedVersions { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the author
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "Author")]
|
|
public virtual string Author { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the display order
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "DisplayOrder")]
|
|
public virtual int DisplayOrder { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name of the assembly file
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "FileName")]
|
|
public virtual string AssemblyFileName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the description
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "Description")]
|
|
public virtual string Description { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the list of store identifiers in which this plugin is available. If empty, then this plugin is available in all stores
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "LimitedToStores")]
|
|
public virtual IList<int> LimitedToStores { get; set; }
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "LimitedToCustomerRoles")]
|
|
public virtual IList<int> LimitedToCustomerRoles { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the list of plugins' system name that this plugin depends on
|
|
/// </summary>
|
|
[JsonProperty(PropertyName = "DependsOnSystemNames")]
|
|
public virtual IList<string> DependsOn { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the value indicating whether plugin is installed
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual bool Installed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the plugin type
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual Type PluginType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the original assembly file
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual string OriginalAssemblyFile { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the list of all library files in the plugin directory
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual IList<string> PluginFiles { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the assembly that is active in the application
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual Assembly ReferencedAssembly { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the value indicating whether need to show the plugin on plugins page
|
|
/// </summary>
|
|
[JsonIgnore]
|
|
public virtual bool ShowInPluginsList { get; set; } = true;
|
|
|
|
#endregion
|
|
} |