#region License Information /* HeuristicLab * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; namespace HeuristicLab.PluginInfrastructure.Manager { /// /// Holds information of loaded plugins that is needed for plugin management. /// Used to represent plugins in AppDomains without loading the plugin assemblies. /// [Serializable] public sealed class PluginDescription : IPluginDescription { private int nTimesLoaded; private string name; /// /// Gets the name of the plugin. /// public string Name { get { return name; } internal set { name = value; } } private string description; /// /// Gets or sets the description of the plugin. /// public string Description { get { return description; } internal set { description = value; } } private Version version; /// /// Gets the version of the plugin. /// public Version Version { get { return version; } internal set { version = value; } } private string contactName; /// /// Gets or sets the name of the contact person for this plugin. /// public string ContactName { get { return contactName; } internal set { contactName = value; } } private string contactEmail; /// /// Gets or sets the e-mail address of the contact person for this plugin. /// public string ContactEmail { get { return contactEmail; } internal set { contactEmail = value; } } private string licenseText; /// /// Gets or sets the license text of the plugin. /// public string LicenseText { get { return licenseText; } internal set { licenseText = value; } } private PluginState pluginState; /// /// Gets or sets the plugin state. /// public PluginState PluginState { get { return pluginState; } } private string loadingErrorInformation; /// /// Gets the error message why this plugin has been disabled. /// internal string LoadingErrorInformation { get { return loadingErrorInformation; } } private List files = new List(); /// /// Gets the names of all files that belong to this plugin. /// These files are deleted when the plugin is removed or updated. /// public IEnumerable Files { get { return files.Cast(); } } internal void AddFiles(IEnumerable fileNames) { files.AddRange(fileNames); } private List dependencies = new List(); internal IEnumerable Dependencies { get { return dependencies; } } /// /// Gets all dependencies of the plugin. /// IEnumerable IPluginDescription.Dependencies { get { return dependencies.Cast(); } } internal void AddDependency(PluginDescription dependency) { dependencies.Add(dependency); } /// /// Gets the locations (file names) of the assemblies that belong to this plugin. /// public IEnumerable AssemblyLocations { get { return Files.Where(f => f.Type == PluginFileType.Assembly).Select(f => f.Name); } } /// /// Gets and sets the list of assembly names for this plugin. Assembly names are only available after the plugin has been loaded. /// private List assemblyNames; public IEnumerable AssemblyNames { get { return assemblyNames; } set { this.assemblyNames = new List(value); } } internal PluginDescription() { pluginState = PluginState.Undefined; } internal void Disable(string loadingErrorInformation) { if (pluginState != PluginState.Undefined) throw new InvalidOperationException("Cannot disable a plugin in state " + pluginState); pluginState = PluginState.Disabled; this.loadingErrorInformation = loadingErrorInformation; } internal void Enable() { if (pluginState != PluginState.Undefined) throw new InvalidOperationException("Cannot enable a plugin in state " + pluginState); pluginState = PluginState.Enabled; } internal void Load() { if (!(pluginState == PluginState.Enabled || pluginState == PluginState.Loaded)) throw new InvalidOperationException("Cannot load a plugin in state " + pluginState); pluginState = PluginState.Loaded; nTimesLoaded++; } internal void Unload() { if (pluginState != PluginState.Loaded) throw new InvalidOperationException("Cannot unload a plugin in state " + pluginState); nTimesLoaded--; if (nTimesLoaded == 0) pluginState = PluginState.Enabled; } /// /// Gets the string representation of the plugin. /// /// The name of the plugin. public override string ToString() { return Name + " " + Version; } // equals and hashcode have to be implemented because we want to compare PluginDescriptions from // different AppDomains and serialization destroys reference equality /// /// Checks whether the given object is equal to the current plugin. /// /// The object to compare. /// true if it is equal, false otherwise. public override bool Equals(object obj) { PluginDescription other = obj as PluginDescription; if (other == null) return false; return other.Name == this.Name && other.Version == this.Version; } /// /// Gets the hash code of the current plugin. /// /// The hash code of the plugin. public override int GetHashCode() { if (version != null) { return name.GetHashCode() + version.GetHashCode(); } else return name.GetHashCode(); } } }