Changeset 2488
- Timestamp:
- 11/12/09 17:45:45 (14 years ago)
- Location:
- branches/PluginInfrastructure Refactoring
- Files:
-
- 4 added
- 14 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/ApplicationDescription.cs
r2481 r2488 29 29 /// </summary> 30 30 [Serializable] 31 public class ApplicationDescription {31 public class ApplicationDescription : IApplicationDescription { 32 32 private string name; 33 33 … … 67 67 } 68 68 69 private string pluginAssembly;69 private string declaringAssemblyName; 70 70 /// <summary> 71 71 /// Gets or sets the name of the assembly that contains the IApplication type. 72 72 /// </summary> 73 public string PluginAssembly{74 get { return pluginAssembly; }75 set { pluginAssembly= value; }73 public string DeclaringAssemblyName { 74 get { return declaringAssemblyName; } 75 set { declaringAssemblyName = value; } 76 76 } 77 77 78 private string pluginType;78 private string declaringTypeName; 79 79 /// <summary> 80 80 /// Gets or sets the name of the type that implements the interface IApplication. 81 81 /// </summary> 82 public string PluginType {83 get { return pluginType; }84 set { pluginType = value; }82 public string DeclaringTypeName { 83 get { return declaringTypeName; } 84 set { declaringTypeName = value; } 85 85 } 86 86 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/ApplicationManager.cs
r2481 r2488 27 27 using System.Security.Permissions; 28 28 using System.Security; 29 using System.Linq; 29 30 30 31 namespace HeuristicLab.PluginInfrastructure.Manager { 31 32 32 public class ApplicationManager { 33 public class ApplicationManager : MarshalByRefObject, IApplicationManager { 34 private List<IPluginDescription> plugins; 33 35 /// <summary> 34 /// Event handler for actions in the application manager.36 /// Gets all plugins. 35 37 /// </summary> 36 public event PluginManagerActionEventHandler Action; 37 38 // singleton pattern 39 public ApplicationManager() { 40 applications = new List<ApplicationDescription>(); 38 public IEnumerable<IPluginDescription> Plugins { 39 get { return plugins; } 41 40 } 42 41 43 private ApplicationManager singleton = new ApplicationManager(); 44 public ApplicationManager Manager { 45 get { return singleton; } 42 private List<IApplicationDescription> applications; 43 /// <summary> 44 /// Gets all installed applications. 45 /// </summary> 46 public IEnumerable<IApplicationDescription> Applications { 47 get { return applications; } 48 } 49 50 public ApplicationManager() : base() { } 51 52 internal void PrepareApplicationDomain(IEnumerable<IApplicationDescription> apps, IEnumerable<IPluginDescription> plugins) { 53 this.plugins = new List<IPluginDescription>(plugins); 54 this.applications = new List<IApplicationDescription>(apps); 55 PluginInfrastructure.ApplicationManager.RegisterApplicationManager(this); 56 LoadPlugins(plugins); 57 } 58 59 private void LoadPlugins(IEnumerable<IPluginDescription> plugins) { 60 // load all loadable plugins (all dependencies available) into the execution context 61 foreach (var desc in PluginDescriptionIterator.IterateInDependencyOrder(plugins.Where(x => x.PluginState != PluginState.Disabled))) { 62 foreach (var plugin in GetInstances<IPlugin>(desc)) { 63 plugin.OnLoad(); 64 } 65 desc.Load(); 66 } 67 } 68 69 internal void Run(IApplicationDescription appInfo) { 70 IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo.DeclaringAssemblyName, appInfo.DeclaringTypeName).Unwrap(); 71 try { 72 runnablePlugin.Run(); 73 } 74 catch (Exception e) { 75 throw new Exception(String.Format( 76 "Unexpected exception caught: \"{0}\"\r\n" + 77 "Type: {1}\r\n" + 78 "Plugin {2}:\r\n{3}", 79 e.Message, 80 e.GetType().FullName, 81 appInfo.Name, 82 e.ToString())); 83 } 84 } 85 86 /// <summary> 87 /// Creates an instance of all types that are subtypes or the same type of the specified type and declared in <paramref name="plugin"/> 88 /// </summary> 89 /// <typeparam name="T">Most general type.</typeparam> 90 /// <returns>Enumerable of the created instances.</returns> 91 public IEnumerable<T> GetInstances<T>(IPluginDescription plugin) where T : class { 92 return from t in GetTypes(typeof(T), plugin) 93 where !t.IsAbstract && !t.IsInterface && !t.HasElementType 94 select (T)Activator.CreateInstance(t); 95 } 96 /// <summary> 97 /// Creates an instance of all types that are subtypes or the same type of the specified type 98 /// </summary> 99 /// <typeparam name="T">Most general type.</typeparam> 100 /// <returns>Enumerable of the created instances.</returns> 101 public IEnumerable<T> GetInstances<T>() where T : class { 102 return from i in GetInstances(typeof(T)) 103 select (T)i; 104 } 105 106 /// <summary> 107 /// Creates an instance of all types that are subtypes or the same type of the specified type 108 /// </summary> 109 /// <typeparam name="type">Most general type.</typeparam> 110 /// <returns>Enumerable of the created instances.</returns> 111 public IEnumerable<object> GetInstances(Type type) { 112 return from t in GetTypes(type) 113 where !t.IsAbstract && !t.IsInterface && !t.HasElementType 114 select Activator.CreateInstance(t); 115 } 116 117 /// <summary> 118 /// Finds all types that are subtypes or equal to the specified type. 119 /// </summary> 120 /// <param name="type">Most general type for which to find matching types.</param> 121 /// <returns>Enumerable of the discovered types.</returns> 122 public IEnumerable<Type> GetTypes(Type type) { 123 return from asm in AppDomain.CurrentDomain.GetAssemblies() 124 from t in GetTypes(type, asm) 125 select t; 126 } 127 128 /// <summary> 129 /// Finds all types that are subtypes or equal to the specified type if they are part of the given 130 /// <paramref name="plugin"/>. 131 /// </summary> 132 /// <param name="type">Most general type for which to find matching types.</param> 133 /// <param name="plugin">The plugin the subtypes must be part of.</param> 134 /// <returns>Enumerable of the discovered types.</returns> 135 public IEnumerable<Type> GetTypes(Type type, IPluginDescription pluginDescription) { 136 return from asm in AppDomain.CurrentDomain.GetAssemblies() 137 where pluginDescription.Assemblies.Contains(asm.Location) 138 from t in GetTypes(type, asm) 139 select t; 140 } 141 142 /// <summary> 143 /// Gets types that are assignable (same of subtype) to the specified type only from the given assembly. 144 /// </summary> 145 /// <param name="type">Most general type we want to find.</param> 146 /// <param name="assembly">Assembly that should be searched for types.</param> 147 /// <returns>Enumerable of the discovered types.</returns> 148 private IEnumerable<Type> GetTypes(Type type, Assembly assembly) { 149 return from t in assembly.GetTypes() 150 where type.IsAssignableFrom(t) 151 select t; 46 152 } 47 153 48 154 49 private void NotifyListeners(string action, string text) { 50 if (Action != null) { 51 Action(this, new PluginManagerActionEventArgs(text, action)); 52 } 155 // infinite lease time 156 /// <summary> 157 /// Initializes the life time service with infinite lease time. 158 /// </summary> 159 /// <returns><c>null</c>.</returns> 160 public override object InitializeLifetimeService() { 161 return null; 53 162 } 54 163 } 55 164 } 165 -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/HeuristicLab.PluginInfrastructure.Manager.csproj
r2481 r2488 49 49 <ItemGroup> 50 50 <Compile Include="ApplicationDescription.cs" /> 51 <Compile Include="PluginDescriptionIterator.cs" /> 51 <Compile Include="ApplicationManager.cs"> 52 <SubType>Code</SubType> 53 </Compile> 52 54 <Compile Include="Loader.cs" /> 53 <Compile Include="PluginState.cs" />54 55 <Compile Include="PluginDescription.cs" /> 55 56 <Compile Include="PluginManager.cs" /> 56 57 <Compile Include="PluginManagerActionEventArgs.cs" /> 57 58 <Compile Include="Properties\AssemblyInfo.cs" /> 58 <Compile Include="Runner.cs" />59 59 </ItemGroup> 60 60 <ItemGroup> -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/Loader.cs
r2481 r2488 55 55 this.plugins = new List<PluginDescription>(); 56 56 this.pluginDependencies = new Dictionary<PluginDescription, List<string>>(); 57 58 AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ReflectionOnlyAssemblyResolveEventHandler; 59 } 60 61 private Assembly ReflectionOnlyAssemblyResolveEventHandler(object sender, ResolveEventArgs args) { 62 //try { 63 return Assembly.ReflectionOnlyLoad(args.Name); 64 //} 65 //catch (FileLoadException ex) { 66 // return null; 67 //} 57 68 } 58 69 … … 70 81 /// </summary> 71 82 internal void Init() { 72 //AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += delegate(object sender, ResolveEventArgs args) {73 // try {74 // return Assembly.ReflectionOnlyLoad(args.Name);75 // }76 // catch (FileLoadException ex) {77 // return null;78 // }79 //};80 83 pluginDependencies.Clear(); 81 84 … … 91 94 CheckPluginDependencies(pluginDescriptions); 92 95 96 // mark all plugins as enabled that were not disabled in CheckPluginFiles or CheckPluginDependencies 97 foreach (var desc in pluginDescriptions) 98 if (desc.PluginState != PluginState.Disabled) 99 desc.Enable(); 100 93 101 // test full loading (in contrast to reflection only loading) of plugins 94 102 // disables plugins that are not loaded correctly … … 100 108 101 109 private void DiscoverApplications() { 102 DiscoveryService service = new DiscoveryService();103 IApplication[] apps = service.GetInstances<IApplication>();104 110 applications = new List<ApplicationDescription>(); 105 111 106 foreach (IApplication application in apps) {112 foreach (IApplication application in GetApplications()) { 107 113 ApplicationDescription info = new ApplicationDescription(); 108 114 info.Name = application.Name; … … 110 116 info.Description = application.Description; 111 117 info.AutoRestart = application.RestartOnErrors; 112 info. PluginAssembly= application.GetType().Assembly.GetName().Name;113 info. PluginType = application.GetType().Namespace + "." + application.GetType().Name;118 info.DeclaringAssemblyName = application.GetType().Assembly.GetName().Name; 119 info.DeclaringTypeName = application.GetType().Namespace + "." + application.GetType().Name; 114 120 115 121 applications.Add(info); 116 122 } 123 } 124 125 private IEnumerable<IApplication> GetApplications() { 126 return from asm in AppDomain.CurrentDomain.GetAssemblies() 127 from t in asm.GetTypes() 128 where typeof(IApplication).IsAssignableFrom(t) && 129 !t.IsAbstract && !t.IsInterface && !t.HasElementType 130 select (IApplication)Activator.CreateInstance(t); 117 131 } 118 132 … … 198 212 // iterate through all custom attributes and search for attributed that we are interested in 199 213 foreach (CustomAttributeData attributeData in attributes) { 200 if (IsAttributeDataForType(attributeData, typeof(Plugin DescriptionAttribute))) {214 if (IsAttributeDataForType(attributeData, typeof(PluginAttribute))) { 201 215 pluginName = (string)attributeData.ConstructorArguments[0].Value; 202 216 } else if (IsAttributeDataForType(attributeData, typeof(PluginDependencyAttribute))) { … … 222 236 info.AddAssemblies(pluginAssemblies); 223 237 info.AddFiles(pluginFiles); 224 info.PluginState = PluginState.Undefined;225 238 226 239 this.pluginDependencies[info] = pluginDependencies; … … 246 259 } else { 247 260 // no plugin description that matches the dependency name is available => plugin is disabled 248 desc. PluginState = PluginState.Disabled;261 desc.Disable(); 249 262 break; // stop processing more dependencies 250 263 } … … 257 270 if (IsAnyDependencyDisabled(pluginDescription)) { 258 271 // PluginDescription.Message = "Disabled: missing plugin dependency."; 259 pluginDescription. PluginState = PluginState.Disabled;272 pluginDescription.Disable(); 260 273 } 261 274 } … … 273 286 private void LoadPlugins(IEnumerable<PluginDescription> pluginDescriptions) { 274 287 // load all loadable plugins (all dependencies available) into the execution context 275 foreach (PluginDescription desc in PluginDescriptionIterator.IterateInDependencyOrder(pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled))) { 288 foreach (var desc in PluginDescriptionIterator.IterateInDependencyOrder(pluginDescriptions 289 .Cast<IPluginDescription>() 290 .Where(x => x.PluginState != PluginState.Disabled))) { 276 291 List<Type> types = new List<Type>(); 277 292 foreach (string assembly in desc.Assemblies) { … … 288 303 IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType); 289 304 plugin.OnLoad(); 305 desc.Load(); 290 306 PluginAction(this, new PluginManagerActionEventArgs(plugin.Name, PluginManagerAction.PluginLoaded)); 291 307 } … … 335 351 if (!CheckPluginFiles(desc)) { 336 352 //plugin.Message = "Disabled: missing plugin file."; 337 desc. PluginState = PluginState.Disabled;353 desc.Disable(); 338 354 } 339 355 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/PluginDescription.cs
r2481 r2488 30 30 /// </summary> 31 31 [Serializable] 32 public class PluginDescription {32 public class PluginDescription : IPluginDescription { 33 33 private string name; 34 34 /// <summary> … … 62 62 public PluginState PluginState { 63 63 get { return pluginState; } 64 set { pluginState = value; } 64 } 65 66 private int nTimesLoaded; 67 public void Disable() { 68 if (pluginState != PluginState.Undefined) 69 throw new InvalidOperationException("Can't disabled a plugin in state " + pluginState); 70 pluginState = PluginState.Disabled; 71 } 72 73 public void Enable() { 74 if (pluginState != PluginState.Undefined) 75 throw new InvalidOperationException("Can't enabled a plugin in state " + pluginState); 76 pluginState = PluginState.Enabled; 77 } 78 79 public void Load() { 80 if (!(pluginState == PluginState.Enabled || pluginState == PluginState.Loaded)) 81 throw new InvalidOperationException("Can't loaded a plugin in state " + pluginState); 82 pluginState = PluginState.Loaded; 83 nTimesLoaded++; 84 } 85 86 public void Unload() { 87 if (pluginState != PluginState.Loaded) 88 throw new InvalidOperationException("Can't unload a plugin in state " + pluginState); 89 nTimesLoaded--; 90 if (nTimesLoaded == 0) pluginState = PluginState.Enabled; 65 91 } 66 92 … … 78 104 } 79 105 80 private List< PluginDescription> dependencies = new List<PluginDescription>();106 private List<IPluginDescription> dependencies = new List<IPluginDescription>(); 81 107 /// <summary> 82 108 /// Gets all dependencies of the plugin. 83 109 /// </summary> 84 public IEnumerable< PluginDescription> Dependencies {110 public IEnumerable<IPluginDescription> Dependencies { 85 111 get { return dependencies; } 86 112 } … … 104 130 } 105 131 132 public PluginDescription() { 133 nTimesLoaded = 0; 134 pluginState = PluginState.Undefined; 135 } 136 137 106 138 //private string message; 107 139 ///// <summary> … … 121 153 } 122 154 123 // equals and hashcode have to be implemented because we want to compare PluginDescriptions from124 // different AppDomains and serialization destroys reference equality125 /// <summary>126 /// Checks whether the given object is equal to the current plugin.127 /// </summary>128 /// <param name="obj">The object to compare.</param>129 /// <returns><c>true</c> if it is equal, <c>false</c> otherwise.</returns>130 public override bool Equals(object obj) {131 if (!(obj is PluginDescription))132 return false;133 PluginDescription other = (PluginDescription)obj;155 //// equals and hashcode have to be implemented because we want to compare PluginDescriptions from 156 //// different AppDomains and serialization destroys reference equality 157 ///// <summary> 158 ///// Checks whether the given object is equal to the current plugin. 159 ///// </summary> 160 ///// <param name="obj">The object to compare.</param> 161 ///// <returns><c>true</c> if it is equal, <c>false</c> otherwise.</returns> 162 //public override bool Equals(object obj) { 163 // if (!(obj is PluginDescription)) 164 // return false; 165 // PluginDescription other = (PluginDescription)obj; 134 166 135 return other.Name == this.Name && other.Version == this.Version;136 }137 /// <summary>138 /// Gets the hash code of the current plugin.139 /// </summary>140 /// <returns>The hash code of the plugin.</returns>141 public override int GetHashCode() {142 if (version != null) {143 return name.GetHashCode() + version.GetHashCode();144 } else return name.GetHashCode();145 }167 // return other.Name == this.Name && other.Version == this.Version; 168 //} 169 ///// <summary> 170 ///// Gets the hash code of the current plugin. 171 ///// </summary> 172 ///// <returns>The hash code of the plugin.</returns> 173 //public override int GetHashCode() { 174 // if (version != null) { 175 // return name.GetHashCode() + version.GetHashCode(); 176 // } else return name.GetHashCode(); 177 //} 146 178 } 147 179 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/PluginManager.cs
r2481 r2488 27 27 using System.Security.Permissions; 28 28 using System.Security; 29 using System.Linq; 29 30 30 31 namespace HeuristicLab.PluginInfrastructure.Manager { … … 81 82 82 83 private List<PluginDescription> plugins; 83 public IEnumerable<PluginDescription> Plugins {84 get { return plugins; }85 }84 //public IEnumerable<PluginDescription> Plugins { 85 // get { return plugins; } 86 //} 86 87 87 88 private List<ApplicationDescription> applications; … … 109 110 plugins = new List<PluginDescription>(remoteLoader.Plugins); 110 111 applications = new List<ApplicationDescription>(remoteLoader.Applications); 111 throw new NotImplementedException(); 112 113 // discard the AppDomain that was used for plugin discovery 114 UnloadAppDomain(pluginDomain); 115 } 116 117 private void UnloadAppDomain(AppDomain appDomain) { 118 AppDomain.Unload(appDomain); 119 120 // set all loaded plugins back to enabled 121 foreach (var pluginDescription in plugins) 122 pluginDescription.Unload(); 112 123 } 113 124 … … 130 141 public void Run(ApplicationDescription appInfo) { 131 142 // create a separate AppDomain for the application 132 // activate a PluginRunner instance in the application143 // initialize the static ApplicationManager in the AppDomain 133 144 // and remotely tell it to start the application 134 145 … … 139 150 setup.PrivateBinPath = pluginDir; 140 151 applicationDomain = AppDomain.CreateDomain(appInfo.Name, null, setup); 141 Runner remoteRunner = (Runner)applicationDomain.CreateInstanceAndUnwrap(typeof(Runner).Assembly.GetName().Name, typeof(Runner).FullName); 142 remoteRunner.PluginAction += delegate(object sender, PluginManagerActionEventArgs args) { if (Action != null) Action(this, args); }; 143 remoteRunner.LoadPlugins(Plugins); 152 ApplicationManager applicationManager = 153 (ApplicationManager)applicationDomain.CreateInstanceAndUnwrap("HeuristicLab.PluginInfraStructure.Manager", "HeuristicLab.PluginInfrastructure.Manager.ApplicationManager"); 154 //applicationManager.PluginAction += delegate(object sender, PluginManagerActionEventArgs args) { if (Action != null) Action(this, args); }; 155 applicationManager.PrepareApplicationDomain( 156 new List<IApplicationDescription>(applications.Cast<IApplicationDescription>()), 157 new List<IPluginDescription>(plugins.Cast<IPluginDescription>())); 144 158 NotifyListeners(PluginManagerAction.Initialized, "All plugins"); 145 remoteRunner.Run(appInfo);159 applicationManager.Run(appInfo); 146 160 } 147 161 finally { -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure.Manager/Runner.cs
r2481 r2488 44 44 } 45 45 46 public void LoadPlugins(IEnumerable< PluginDescription> pluginDescriptions) {46 public void LoadPlugins(IEnumerable<IPluginDescription> pluginDescriptions) { 47 47 //FileIOPermission fileperm = new FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:\Program Files\HeuristicLab 3.0\plugins\"); 48 48 //fileperm.Assert(); 49 49 50 50 // load all loadable plugins (all dependencies available) into the execution context 51 foreach ( PluginDescriptiondesc in PluginDescriptionIterator.IterateInDependencyOrder(pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled))) {51 foreach (var desc in PluginDescriptionIterator.IterateInDependencyOrder(pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled))) { 52 52 List<Type> types = new List<Type>(); 53 53 foreach (string assembly in desc.Assemblies) { … … 64 64 IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType); 65 65 plugin.OnLoad(); 66 desc.Load(); 66 67 PluginAction(this, new PluginManagerActionEventArgs(plugin.Name, PluginManagerAction.PluginLoaded)); 67 68 } … … 88 89 89 90 public void Run(ApplicationDescription appInfo) { 90 IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo. PluginAssembly, appInfo.PluginType).Unwrap();91 IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo.DeclaringAssemblyName, appInfo.DeclaringTypeName).Unwrap(); 91 92 try { 92 93 runnablePlugin.Run(); -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Attributes/ApplicationAttribute.cs
r2475 r2488 30 30 /// </summary> 31 31 [AttributeUsage(AttributeTargets.Class)] 32 public class Application DescriptionAttribute : System.Attribute {32 public class ApplicationAttribute : System.Attribute { 33 33 private string name; 34 34 /// <summary> … … 40 40 } 41 41 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 //} 50 50 51 51 private string description; … … 68 68 69 69 /// <summary> 70 /// Initializes a new instance of <see cref="Application DescriptionAttribute"/>.70 /// Initializes a new instance of <see cref="ApplicationAttribute"/>. 71 71 /// <param name="name">Name of the application</param> 72 72 /// </summary> 73 public Application DescriptionAttribute(string name)73 public ApplicationAttribute(string name) 74 74 : this(name, "") { 75 75 } 76 76 77 77 /// <summary> 78 /// Initializes a new instance of <see cref="Application DescriptionAttribute"/>.78 /// Initializes a new instance of <see cref="ApplicationAttribute"/>. 79 79 /// <param name="name">Name of the application</param> 80 80 /// <param name="description">Description of the application</param> 81 81 /// </summary> 82 public Application DescriptionAttribute(string name, string description)83 : this(name, description, "") {82 public ApplicationAttribute(string name, string description) 83 : this(name, description, false) { 84 84 } 85 85 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 //} 95 95 96 96 /// <summary> 97 /// Initializes a new instance of <see cref="Application DescriptionAttribute"/>.97 /// Initializes a new instance of <see cref="ApplicationAttribute"/>. 98 98 /// <param name="name">Name of the application</param> 99 99 /// <param name="description">Description of the application</param> … … 101 101 /// <param name="restartOnErrors">Flag that indicates if the application should be restarted on exceptions (for services)</param> 102 102 /// </summary> 103 public Application DescriptionAttribute(string name, string description, string version, bool restartOnErrors) {103 public ApplicationAttribute(string name, string description, bool restartOnErrors) { 104 104 this.name = name; 105 this.version = version;106 105 this.description = description; 107 106 this.restartOnErrors = restartOnErrors; -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Attributes/PluginAttribute.cs
r2481 r2488 30 30 /// </summary> 31 31 [AttributeUsage(AttributeTargets.Class)] 32 public class Plugin DescriptionAttribute : System.Attribute {32 public class PluginAttribute : System.Attribute { 33 33 private string name; 34 34 /// <summary> … … 49 49 //} 50 50 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 } 59 59 60 60 /// <summary> 61 /// Initializes a new instance of <see cref="Plugin DescriptionAttribute"/>.61 /// Initializes a new instance of <see cref="PluginAttribute"/>. 62 62 /// <param name="name">Name of the plugin</param> 63 63 /// </summary> 64 public Plugin DescriptionAttribute(string name) {65 this.name = name;64 public PluginAttribute(string name) 65 : this(name, "") { 66 66 } 67 67 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 } 76 77 77 78 ///// <summary> -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs
r2475 r2488 29 29 /// Default implementation for the IApplication interface. 30 30 /// </summary> 31 internalabstract class ApplicationBase : IApplication {31 public abstract class ApplicationBase : IApplication { 32 32 /// <summary> 33 33 /// Initializes a new instance of <see cref="ApplicationBase"/>. … … 35 35 public ApplicationBase() { } 36 36 37 private Application DescriptionAttribute ApplicationDescriptionAttribute {37 private ApplicationAttribute ApplicationAttribute { 38 38 get { 39 object[] app DescAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationDescriptionAttribute), false);39 object[] appAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationAttribute), false); 40 40 41 41 // exactly one attribute of the type ClassInfoAttribute must be given 42 if (app DescAttributes.Length != 1) {43 throw new InvalidPluginException("Found multiple Application DescriptionAttributes on type " + this.GetType());42 if (appAttributes.Length != 1) { 43 throw new InvalidPluginException("Found multiple ApplicationAttributes on type " + this.GetType()); 44 44 } 45 45 46 return (Application DescriptionAttribute)appDescAttributes[0];46 return (ApplicationAttribute)appAttributes[0]; 47 47 } 48 48 } … … 54 54 /// </summary> 55 55 public string Name { 56 get { return Application DescriptionAttribute.Name; }56 get { return ApplicationAttribute.Name; } 57 57 } 58 58 … … 62 62 public Version Version { 63 63 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; 71 65 } 72 66 } … … 77 71 public string Description { 78 72 get { 79 var appDescAttribute = Application DescriptionAttribute;73 var appDescAttribute = ApplicationAttribute; 80 74 // if the description is not explicitly set in the attribute then the name of the application is used as default 81 75 if (string.IsNullOrEmpty(appDescAttribute.Description)) { … … 92 86 public bool RestartOnErrors { 93 87 get { 94 return Application DescriptionAttribute.RestartOnErrors;88 return ApplicationAttribute.RestartOnErrors; 95 89 } 96 90 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/BaseClasses/PluginBase.cs
r2481 r2488 37 37 public PluginBase() { } 38 38 39 private Plugin DescriptionAttribute PluginDescriptionAttribute {39 private PluginAttribute PluginAttribute { 40 40 get { 41 object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(Plugin DescriptionAttribute), false);41 object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(PluginAttribute), false); 42 42 // exactly one attribute of the type PluginDescriptionAttribute must be given 43 43 if (pluginAttributes.Length != 1) { 44 throw new InvalidPluginException("Found multiple Plugin DescriptionAttributes on type " + this.GetType());44 throw new InvalidPluginException("Found multiple PluginAttributes on type " + this.GetType()); 45 45 } 46 return (Plugin DescriptionAttribute)pluginAttributes[0];46 return (PluginAttribute)pluginAttributes[0]; 47 47 } 48 48 } … … 52 52 public string Name { 53 53 get { 54 return Plugin DescriptionAttribute.Name;54 return PluginAttribute.Name; 55 55 } 56 56 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/ControlManager.cs
r2481 r2488 38 38 public static IControlManager Manager { 39 39 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; 41 45 } 42 46 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/DiscoveryService.cs
r2481 r2488 24 24 using System.Text; 25 25 using System.Reflection; 26 using System.Linq; 26 27 27 28 namespace HeuristicLab.PluginInfrastructure { … … 30 31 /// </summary> 31 32 public class DiscoveryService { 33 //internal static IEnumerable<IPluginDescription> plugins; 32 34 33 //public PluginDescription[]Plugins {35 //public IEnumerable<IPluginDescription> Plugins { 34 36 // get { 35 // PluginInfo[] plugins = new PluginInfo[PluginManager.Manager.LoadedPlugins.Count]; 36 // PluginManager.Manager.LoadedPlugins.CopyTo(plugins, 0); 37 // return plugins; 37 // return DiscoveryService.plugins; 38 38 // } 39 39 //} 40 40 41 41 /// <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"/> 43 43 /// </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); 55 50 } 56 57 51 /// <summary> 58 52 /// Creates an instance of all types that are subtypes or the same type of the specified type 59 53 /// </summary> 60 54 /// <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; 71 59 } 72 60 … … 75 63 /// </summary> 76 64 /// <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); 87 70 } 88 71 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 } 106 82 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 } 109 96 110 97 ///// <summary> … … 130 117 /// <param name="type">Most general type we want to find.</param> 131 118 /// <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; 141 124 } 142 125 -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
r2481 r2488 86 86 </ItemGroup> 87 87 <ItemGroup> 88 <Compile Include="Attributes\Application DescriptionAttribute.cs" />88 <Compile Include="Attributes\ApplicationAttribute.cs" /> 89 89 <Compile Include="Attributes\AssemblyBuildDateAttribute.cs" /> 90 <Compile Include="Attributes\PluginAttribute.cs" /> 90 91 <Compile Include="Attributes\PluginDependencyAttribute.cs" /> 91 <Compile Include="Attributes\PluginDescriptionAttribute.cs" />92 92 <Compile Include="Attributes\PluginFileAttribute.cs" /> 93 93 <Compile Include="BaseClasses\ApplicationBase.cs" /> 94 94 <Compile Include="BaseClasses\PluginBase.cs" /> 95 <Compile Include="Interfaces\IApplicationManager.cs" /> 96 <Compile Include="Interfaces\IApplicationDescription.cs" /> 95 97 <Compile Include="Interfaces\IApplication.cs" /> 96 98 <Compile Include="Interfaces\IControl.cs" /> 97 99 <Compile Include="Interfaces\IControlManager.cs" /> 98 100 <Compile Include="Interfaces\IPlugin.cs" /> 99 <Compile Include="DiscoveryService.cs" />100 101 <Compile Include="ControlManager.cs" /> 102 <Compile Include="Interfaces\IPluginDescription.cs" /> 101 103 <Compile Include="InvalidPluginException.cs" /> 104 <Compile Include="PluginDescriptionIterator.cs" /> 105 <Compile Include="ApplicationManager.cs" /> 106 <Compile Include="PluginState.cs" /> 102 107 <Compile Include="Properties\AssemblyInfo.cs" /> 103 108 <EmbeddedResource Include="Properties\Resources.resx"> -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/PluginDescriptionIterator.cs
r2481 r2488 24 24 using System.Text; 25 25 26 namespace HeuristicLab.PluginInfrastructure .Manager{26 namespace HeuristicLab.PluginInfrastructure { 27 27 public static class PluginDescriptionIterator { 28 public static IEnumerable< PluginDescription> IterateInDependencyOrder(IEnumerable<PluginDescription> pluginDescriptions) {28 public static IEnumerable<IPluginDescription> IterateInDependencyOrder(IEnumerable<IPluginDescription> pluginDescriptions) { 29 29 // list to make sure we yield each description only once 30 List< PluginDescription> yieldedDescriptions = new List<PluginDescription>();30 List<IPluginDescription> yieldedDescriptions = new List<IPluginDescription>(); 31 31 foreach (var desc in pluginDescriptions) { 32 32 foreach (var dependency in IterateInDependencyOrder(desc.Dependencies)) { … … 35 35 yield return dependency; 36 36 } 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; 41 41 } 42 42 } -
branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/PluginState.cs
r2481 r2488 24 24 using System.Text; 25 25 26 namespace HeuristicLab.PluginInfrastructure .Manager{26 namespace HeuristicLab.PluginInfrastructure { 27 27 [Serializable] 28 28 public enum PluginState { -
branches/PluginInfrastructure Refactoring/HeuristicLab/MainForm.cs
r2481 r2488 37 37 private ListViewItem pluginManagerListViewItem; 38 38 private bool abortRequested; 39 private PluginManager pluginManager; 39 40 40 41 public MainForm() … … 43 44 44 45 abortRequested = false; 45 PluginManagerpluginManager = new PluginManager(HeuristicLab.PluginInfrastructure.Properties.Settings.Default.PluginDir);46 pluginManager = new PluginManager(HeuristicLab.PluginInfrastructure.Properties.Settings.Default.PluginDir); 46 47 SplashScreen splashScreen = new SplashScreen(pluginManager, 1000, "Loading HeuristicLab..."); 47 48 splashScreen.Owner = this; … … 83 84 if (selected == pluginManagerListViewItem) { 84 85 try { 85 Cursor = Cursors.AppStarting;86 ManagerForm form = new ManagerForm();87 this.Visible = false;88 form.ShowDialog(this);89 // RefreshApplicationsList();90 this.Visible = true;86 //Cursor = Cursors.AppStarting; 87 //ManagerForm form = new ManagerForm(); 88 //this.Visible = false; 89 //form.ShowDialog(this); 90 //// RefreshApplicationsList(); 91 //this.Visible = true; 91 92 } 92 93 finally { … … 95 96 } else { 96 97 ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag; 97 SplashScreen splashScreen = new SplashScreen( 2000, "Loading " + app.Name);98 SplashScreen splashScreen = new SplashScreen(pluginManager, 2000, "Loading " + app.Name); 98 99 splashScreen.Owner = this; 99 100 splashScreen.Show(); 100 PluginManager.Manager.Action += new PluginManagerActionEventHandler(splashScreen.Manager_Action);101 101 Thread t = new Thread(delegate() { 102 102 bool stopped = false; … … 104 104 try { 105 105 if (!abortRequested) 106 PluginManager.Manager.Run(app);106 pluginManager.Run(app); 107 107 stopped = true; 108 108 } -
branches/PluginInfrastructure Refactoring/HeuristicLab/Program.cs
r1107 r2488 38 38 Application.Run(new MainForm()); 39 39 } else if (args.Length == 1) { // start specific application 40 PluginManager.Manager.Initialize();40 //PluginManager.Manager.Initialize(); 41 41 42 ApplicationInfo app = null;43 foreach (ApplicationInfo info in PluginManager.Manager.InstalledApplications) {44 if (info.Name == args[0])45 app = info;46 }47 if (app == null) { // application not found48 MessageBox.Show("Cannot start application.\nApplication " + args[0] + " is not installed.\n\nStarting HeuristicLab in normal mode ...",49 "HeuristicLab",50 MessageBoxButtons.OK,51 MessageBoxIcon.Warning);52 Application.EnableVisualStyles();53 Application.SetCompatibleTextRenderingDefault(false);54 Application.Run(new MainForm());55 } else {56 PluginManager.Manager.Run(app);57 }42 //ApplicationInfo app = null; 43 //foreach (ApplicationInfo info in PluginManager.Manager.InstalledApplications) { 44 // if (info.Name == args[0]) 45 // app = info; 46 //} 47 //if (app == null) { // application not found 48 // MessageBox.Show("Cannot start application.\nApplication " + args[0] + " is not installed.\n\nStarting HeuristicLab in normal mode ...", 49 // "HeuristicLab", 50 // MessageBoxButtons.OK, 51 // MessageBoxIcon.Warning); 52 // Application.EnableVisualStyles(); 53 // Application.SetCompatibleTextRenderingDefault(false); 54 // Application.Run(new MainForm()); 55 //} else { 56 // PluginManager.Manager.Run(app); 57 //} 58 58 } 59 59 }
Note: See TracChangeset
for help on using the changeset viewer.