Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/12/09 17:45:45 (15 years ago)
Author:
gkronber
Message:

Worked on plugin infrastructure refactoring. (Fully functional revision). #799

Location:
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure
Files:
4 added
5 edited
4 moved

Legend:

Unmodified
Added
Removed
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Attributes/ApplicationAttribute.cs

    r2475 r2488  
    3030  /// </summary>
    3131  [AttributeUsage(AttributeTargets.Class)]
    32   public class ApplicationDescriptionAttribute : System.Attribute {
     32  public class ApplicationAttribute : System.Attribute {
    3333    private string name;
    3434    /// <summary>
     
    4040    }
    4141
    42     private string version;
    43     /// <summary>
    44     /// Gets or sets the version of the application.
    45     /// </summary>
    46     public string Version {
    47       get { return version; }
    48       set { version = value; }
    49     }
     42    //private string version;
     43    ///// <summary>
     44    ///// Gets or sets the version of the application.
     45    ///// </summary>
     46    //public string Version {
     47    //  get { return version; }
     48    //  set { version = value; }
     49    //}
    5050
    5151    private string description;
     
    6868
    6969    /// <summary>
    70     /// Initializes a new instance of <see cref="ApplicationDescriptionAttribute"/>.
     70    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
    7171    /// <param name="name">Name of the application</param>
    7272    /// </summary>
    73     public ApplicationDescriptionAttribute(string name)
     73    public ApplicationAttribute(string name)
    7474      : this(name, "") {
    7575    }
    7676
    7777    /// <summary>
    78     /// Initializes a new instance of <see cref="ApplicationDescriptionAttribute"/>.
     78    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
    7979    /// <param name="name">Name of the application</param>
    8080    /// <param name="description">Description of the application</param>
    8181    /// </summary>
    82     public ApplicationDescriptionAttribute(string name, string description)
    83       : this(name, description, "") {
     82    public ApplicationAttribute(string name, string description)
     83      : this(name, description, false) {
    8484    }
    8585
    86     /// <summary>
    87     /// Initializes a new instance of <see cref="ApplicationDescriptionAttribute"/>.
    88     /// <param name="name">Name of the application</param>
    89     /// <param name="description">Description of the application</param>
    90     /// <param name="version">Version string of the application</param>
    91     /// </summary>
    92     public ApplicationDescriptionAttribute(string name, string description, string version)
    93       : this(name, description, version, false) {
    94     }
     86    ///// <summary>
     87    ///// Initializes a new instance of <see cref="ApplicationAttribute"/>.
     88    ///// <param name="name">Name of the application</param>
     89    ///// <param name="description">Description of the application</param>
     90    ///// <param name="version">Version string of the application</param>
     91    ///// </summary>
     92    //public ApplicationAttribute(string name, string description, string version)
     93    //  : this(name, description, version, false) {
     94    //}
    9595
    9696    /// <summary>
    97     /// Initializes a new instance of <see cref="ApplicationDescriptionAttribute"/>.
     97    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
    9898    /// <param name="name">Name of the application</param>
    9999    /// <param name="description">Description of the application</param>
     
    101101    /// <param name="restartOnErrors">Flag that indicates if the application should be restarted on exceptions (for services)</param>
    102102    /// </summary>
    103     public ApplicationDescriptionAttribute(string name, string description, string version, bool restartOnErrors) {
     103    public ApplicationAttribute(string name, string description, bool restartOnErrors) {
    104104      this.name = name;
    105       this.version = version;
    106105      this.description = description;
    107106      this.restartOnErrors = restartOnErrors;
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Attributes/PluginAttribute.cs

    r2481 r2488  
    3030  /// </summary>
    3131  [AttributeUsage(AttributeTargets.Class)]
    32   public class PluginDescriptionAttribute : System.Attribute {
     32  public class PluginAttribute : System.Attribute {
    3333    private string name;
    3434    /// <summary>
     
    4949    //}
    5050
    51     //private string description;
    52     ///// <summary>
    53     ///// Gets or sets the description of the plugin.
    54     ///// </summary>
    55     //public string Description {
    56     //  get { return description; }
    57     // set { description = value; }
    58     //}
     51    private string description;
     52    /// <summary>
     53    /// Gets or sets the description of the plugin.
     54    /// </summary>
     55    public string Description {
     56      get { return description; }
     57      // set { description = value; }
     58    }
    5959
    6060    /// <summary>
    61     /// Initializes a new instance of <see cref="PluginDescriptionAttribute"/>.
     61    /// Initializes a new instance of <see cref="PluginAttribute"/>.
    6262    /// <param name="name">Name of the plugin</param>
    6363    /// </summary>
    64     public PluginDescriptionAttribute(string name) {
    65       this.name = name;
     64    public PluginAttribute(string name)
     65      : this(name, "") {
    6666    }
    6767
    68     ///// <summary>
    69     ///// Initializes a new instance of <see cref="PluginDescriptionAttribute"/>.
    70     ///// <param name="name">Name of the plugin</param>
    71     ///// <param name="description">Description of the plugin</param>
    72     ///// </summary>
    73     //public PluginDescriptionAttribute(string name, string description)
    74     //  : this(name, description, "") {
    75     //}
     68    /// <summary>
     69    /// Initializes a new instance of <see cref="PluginAttribute"/>.
     70    /// <param name="name">Name of the plugin</param>
     71    /// <param name="description">Description of the plugin</param>
     72    /// </summary>
     73    public PluginAttribute(string name, string description) {
     74      this.name = name;
     75      this.description = description;
     76    }
    7677
    7778    ///// <summary>
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs

    r2475 r2488  
    2929  /// Default implementation for the IApplication interface.
    3030  /// </summary>
    31   internal abstract class ApplicationBase : IApplication {
     31  public abstract class ApplicationBase : IApplication {
    3232    /// <summary>
    3333    /// Initializes a new instance of <see cref="ApplicationBase"/>.
     
    3535    public ApplicationBase() { }
    3636
    37     private ApplicationDescriptionAttribute ApplicationDescriptionAttribute {
     37    private ApplicationAttribute ApplicationAttribute {
    3838      get {
    39         object[] appDescAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationDescriptionAttribute), false);
     39        object[] appAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationAttribute), false);
    4040
    4141        // exactly one attribute of the type ClassInfoAttribute must be given
    42         if (appDescAttributes.Length != 1) {
    43           throw new InvalidPluginException("Found multiple ApplicationDescriptionAttributes on type " + this.GetType());
     42        if (appAttributes.Length != 1) {
     43          throw new InvalidPluginException("Found multiple ApplicationAttributes on type " + this.GetType());
    4444        }
    4545
    46         return (ApplicationDescriptionAttribute)appDescAttributes[0];
     46        return (ApplicationAttribute)appAttributes[0];
    4747      }
    4848    }
     
    5454    /// </summary>
    5555    public string Name {
    56       get { return ApplicationDescriptionAttribute.Name; }
     56      get { return ApplicationAttribute.Name; }
    5757    }
    5858
     
    6262    public Version Version {
    6363      get {
    64         var appDescAttribute = ApplicationDescriptionAttribute;
    65         // if the version is not explicitly set in the attribute then the version of the assembly is used as default
    66         if (string.IsNullOrEmpty(appDescAttribute.Version)) {
    67           return this.GetType().Assembly.GetName().Version;
    68         } else {
    69           return new Version(appDescAttribute.Version);
    70         }
     64        return this.GetType().Assembly.GetName().Version;
    7165      }
    7266    }
     
    7771    public string Description {
    7872      get {
    79         var appDescAttribute = ApplicationDescriptionAttribute;
     73        var appDescAttribute = ApplicationAttribute;
    8074        // if the description is not explicitly set in the attribute then the name of the application is used as default
    8175        if (string.IsNullOrEmpty(appDescAttribute.Description)) {
     
    9286    public bool RestartOnErrors {
    9387      get {
    94         return ApplicationDescriptionAttribute.RestartOnErrors;
     88        return ApplicationAttribute.RestartOnErrors;
    9589      }
    9690    }
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/BaseClasses/PluginBase.cs

    r2481 r2488  
    3737    public PluginBase() { }
    3838
    39     private PluginDescriptionAttribute PluginDescriptionAttribute {
     39    private PluginAttribute PluginAttribute {
    4040      get {
    41         object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(PluginDescriptionAttribute), false);
     41        object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(PluginAttribute), false);
    4242        // exactly one attribute of the type PluginDescriptionAttribute must be given
    4343        if (pluginAttributes.Length != 1) {
    44           throw new InvalidPluginException("Found multiple PluginDescriptionAttributes on type " + this.GetType());
     44          throw new InvalidPluginException("Found multiple PluginAttributes on type " + this.GetType());
    4545        }
    46         return (PluginDescriptionAttribute)pluginAttributes[0];
     46        return (PluginAttribute)pluginAttributes[0];
    4747      }
    4848    }
     
    5252    public string Name {
    5353      get {
    54         return PluginDescriptionAttribute.Name;
     54        return PluginAttribute.Name;
    5555      }
    5656    }
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/ControlManager.cs

    r2481 r2488  
    3838    public static IControlManager Manager {
    3939      get { return controlManager; }
    40       set { controlManager = value; }
     40    }
     41
     42    public static void RegisterManager(IControlManager manager) {
     43      if (controlManager != null) throw new InvalidOperationException("An control manager has already been set.");
     44      controlManager = manager;
    4145    }
    4246  }
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/DiscoveryService.cs

    r2481 r2488  
    2424using System.Text;
    2525using System.Reflection;
     26using System.Linq;
    2627
    2728namespace HeuristicLab.PluginInfrastructure {
     
    3031  /// </summary>
    3132  public class DiscoveryService {
     33    //internal static IEnumerable<IPluginDescription> plugins;
    3234
    33     //public PluginDescription[] Plugins {
     35    //public IEnumerable<IPluginDescription> Plugins {
    3436    //  get {
    35     //    PluginInfo[] plugins = new PluginInfo[PluginManager.Manager.LoadedPlugins.Count];
    36     //    PluginManager.Manager.LoadedPlugins.CopyTo(plugins, 0);
    37     //    return plugins;
     37    //    return DiscoveryService.plugins;
    3838    //  }
    3939    //}
    4040
    4141    /// <summary>
    42     /// Finds all types that are subtypes or equal to the specified type.
     42    /// Creates an instance of all types that are subtypes or the same type of the specified type and declared in <paramref name="plugin"/>
    4343    /// </summary>
    44     /// <param name="type">Most general type for which to find matching types.</param>
    45     /// <returns>The found types as array.</returns>
    46     public Type[] GetTypes(Type type) {
    47       Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    48       List<Type> types = new List<Type>();
    49       foreach (Assembly asm in assemblies) {
    50         Array.ForEach<Type>(GetTypes(type, asm), delegate(Type t) {
    51           types.Add(t);
    52         });
    53       }
    54       return types.ToArray();
     44    /// <typeparam name="T">Most general type.</typeparam>
     45    /// <returns>Enumerable of the created instances.</returns>
     46    public IEnumerable<T> GetInstances<T>(IPluginDescription plugin) where T : class {
     47      return from t in GetTypes(typeof(T), plugin)
     48             where !t.IsAbstract && !t.IsInterface && !t.HasElementType
     49             select (T)Activator.CreateInstance(t);
    5550    }
    56 
    5751    /// <summary>
    5852    /// Creates an instance of all types that are subtypes or the same type of the specified type
    5953    /// </summary>
    6054    /// <typeparam name="T">Most general type.</typeparam>
    61     /// <returns>The created instances as array.</returns>
    62     public T[] GetInstances<T>() where T : class {
    63       Type[] types = GetTypes(typeof(T));
    64       List<T> instances = new List<T>();
    65       foreach (Type t in types) {
    66         if (!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
    67           instances.Add((T)Activator.CreateInstance(t));
    68         }
    69       }
    70       return instances.ToArray();
     55    /// <returns>Enumerable of the created instances.</returns>
     56    public IEnumerable<T> GetInstances<T>() where T : class {
     57      return from i in GetInstances(typeof(T))
     58             select (T)i;
    7159    }
    7260
     
    7563    /// </summary>
    7664    /// <typeparam name="type">Most general type.</typeparam>
    77     /// <returns>The created instances as array.</returns>
    78     public object[] GetInstances(Type type) {
    79       Type[] types = GetTypes(type);
    80       List<object> instances = new List<object>();
    81       foreach (Type t in types) {
    82         if (!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
    83           instances.Add(Activator.CreateInstance(t));
    84         }
    85       }
    86       return instances.ToArray();
     65    /// <returns>Enumerable of the created instances.</returns>
     66    public IEnumerable<object> GetInstances(Type type) {
     67      return from t in GetTypes(type)
     68             where !t.IsAbstract && !t.IsInterface && !t.HasElementType
     69             select Activator.CreateInstance(t);
    8770    }
    8871
    89     ///// <summary>
    90     ///// Finds all types that are subtypes or equal to the specified type if they are part of the given
    91     ///// <paramref name="plugin"/>.
    92     ///// </summary>
    93     ///// <param name="type">Most general type for which to find matching types.</param>
    94     ///// <param name="plugin">The plugin the subtypes must be part of.</param>
    95     ///// <returns>The found types as array.</returns>
    96     //public Type[] GetTypes(Type type, PluginInfo plugin) {
    97     //  Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    98     //  List<Type> types = new List<Type>();
    99     //  foreach (Assembly asm in assemblies) {
    100     //    if (plugin.Assemblies.Contains(asm.Location)) {
    101     //      Array.ForEach<Type>(GetTypes(type, asm), delegate(Type t) {
    102     //        types.Add(t);
    103     //      });
    104     //    }
    105     //  }
     72    /// <summary>
     73    /// Finds all types that are subtypes or equal to the specified type.
     74    /// </summary>
     75    /// <param name="type">Most general type for which to find matching types.</param>
     76    /// <returns>Enumerable of the discovered types.</returns>
     77    public IEnumerable<Type> GetTypes(Type type) {
     78      return from asm in AppDomain.CurrentDomain.GetAssemblies()
     79             from t in GetTypes(type, asm)
     80             select t;
     81    }
    10682
    107     //  return types.ToArray();
    108     //}
     83    /// <summary>
     84    /// Finds all types that are subtypes or equal to the specified type if they are part of the given
     85    /// <paramref name="plugin"/>.
     86    /// </summary>
     87    /// <param name="type">Most general type for which to find matching types.</param>
     88    /// <param name="plugin">The plugin the subtypes must be part of.</param>
     89    /// <returns>Enumerable of the discovered types.</returns>
     90    public IEnumerable<Type> GetTypes(Type type, IPluginDescription pluginDescription) {
     91      return from asm in AppDomain.CurrentDomain.GetAssemblies()
     92             where pluginDescription.Assemblies.Contains(asm.Location)
     93             from t in GetTypes(type, asm)
     94             select t;
     95    }
    10996
    11097    ///// <summary>
     
    130117    /// <param name="type">Most general type we want to find.</param>
    131118    /// <param name="assembly">Assembly that should be searched for types.</param>
    132     /// <returns>The found types as array.</returns>
    133     internal Type[] GetTypes(Type type, Assembly assembly) {
    134       List<Type> types = new List<Type>();
    135       foreach (Type t in assembly.GetTypes()) {
    136         if (type.IsAssignableFrom(t)) {
    137           types.Add(t);
    138         }
    139       }
    140       return types.ToArray();
     119    /// <returns>Enumerable of the discovered types.</returns>
     120    private IEnumerable<Type> GetTypes(Type type, Assembly assembly) {
     121      return from t in assembly.GetTypes()
     122             where type.IsAssignableFrom(t)
     123             select t;
    141124    }
    142125
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj

    r2481 r2488  
    8686  </ItemGroup>
    8787  <ItemGroup>
    88     <Compile Include="Attributes\ApplicationDescriptionAttribute.cs" />
     88    <Compile Include="Attributes\ApplicationAttribute.cs" />
    8989    <Compile Include="Attributes\AssemblyBuildDateAttribute.cs" />
     90    <Compile Include="Attributes\PluginAttribute.cs" />
    9091    <Compile Include="Attributes\PluginDependencyAttribute.cs" />
    91     <Compile Include="Attributes\PluginDescriptionAttribute.cs" />
    9292    <Compile Include="Attributes\PluginFileAttribute.cs" />
    9393    <Compile Include="BaseClasses\ApplicationBase.cs" />
    9494    <Compile Include="BaseClasses\PluginBase.cs" />
     95    <Compile Include="Interfaces\IApplicationManager.cs" />
     96    <Compile Include="Interfaces\IApplicationDescription.cs" />
    9597    <Compile Include="Interfaces\IApplication.cs" />
    9698    <Compile Include="Interfaces\IControl.cs" />
    9799    <Compile Include="Interfaces\IControlManager.cs" />
    98100    <Compile Include="Interfaces\IPlugin.cs" />
    99     <Compile Include="DiscoveryService.cs" />
    100101    <Compile Include="ControlManager.cs" />
     102    <Compile Include="Interfaces\IPluginDescription.cs" />
    101103    <Compile Include="InvalidPluginException.cs" />
     104    <Compile Include="PluginDescriptionIterator.cs" />
     105    <Compile Include="ApplicationManager.cs" />
     106    <Compile Include="PluginState.cs" />
    102107    <Compile Include="Properties\AssemblyInfo.cs" />
    103108    <EmbeddedResource Include="Properties\Resources.resx">
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/PluginDescriptionIterator.cs

    r2481 r2488  
    2424using System.Text;
    2525
    26 namespace HeuristicLab.PluginInfrastructure.Manager {
     26namespace HeuristicLab.PluginInfrastructure {
    2727  public static class PluginDescriptionIterator {
    28     public static IEnumerable<PluginDescription> IterateInDependencyOrder(IEnumerable<PluginDescription> pluginDescriptions) {
     28    public static IEnumerable<IPluginDescription> IterateInDependencyOrder(IEnumerable<IPluginDescription> pluginDescriptions) {
    2929      // list to make sure we yield each description only once
    30       List<PluginDescription> yieldedDescriptions = new List<PluginDescription>();
     30      List<IPluginDescription> yieldedDescriptions = new List<IPluginDescription>();
    3131      foreach (var desc in pluginDescriptions) {
    3232        foreach (var dependency in IterateInDependencyOrder(desc.Dependencies)) {
     
    3535            yield return dependency;
    3636          }
    37           if (!yieldedDescriptions.Contains(desc)) {
    38             yieldedDescriptions.Add(desc);
    39             yield return desc;
    40           }
     37        }
     38        if (!yieldedDescriptions.Contains(desc)) {
     39          yieldedDescriptions.Add(desc);
     40          yield return desc;
    4141        }
    4242      }
  • branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/PluginState.cs

    r2481 r2488  
    2424using System.Text;
    2525
    26 namespace HeuristicLab.PluginInfrastructure.Manager {
     26namespace HeuristicLab.PluginInfrastructure {
    2727  [Serializable]
    2828  public enum PluginState {
Note: See TracChangeset for help on using the changeset viewer.