aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-06-12 19:04:09 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-06-12 19:04:09 +0300
commitca50e0c8fc88acd06d6e1932e9412464bff95edb (patch)
treeaaafb06deca983c1e80c8c34508d23a452e4a235 /Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs
parent8a59643571080bfff715f0b0e4bb03e2dee4961a (diff)
downloadTango-ca50e0c8fc88acd06d6e1932e9412464bff95edb.tar.gz
Tango-ca50e0c8fc88acd06d6e1932e9412464bff95edb.zip
Working on PPC modules and loading.
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs146
1 files changed, 146 insertions, 0 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs
new file mode 100644
index 000000000..bb68f05cd
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Modules/DefaultStudioModuleLoader.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core;
+using Tango.BL.Entities;
+using Tango.Logging;
+using Tango.PPC.Common.Authentication;
+using Tango.PPC.Common.Modules;
+using Tango.PPC.Common;
+using Tango.PPC.Jobs;
+
+namespace Tango.PPC.UI.Modules
+{
+ /// <summary>
+ /// Represents the default PPC <see cref="IPPCModuleLoader"></see>.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="Tango.PPC.Common.Modules.IPPCModuleLoader" />
+ public class DefaultPPCModuleLoader : ExtendedObject, IPPCModuleLoader
+ {
+ private IAuthenticationProvider _authenticationProvider;
+ private bool _loaded;
+
+ /// <summary>
+ /// Occurs when the user has logged in and user modules are loaded.
+ /// </summary>
+ public event EventHandler ModulesLoaded;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultPPCModuleLoader"/> class.
+ /// </summary>
+ /// <param name="authenticationProvider">The authentication provider.</param>
+ public DefaultPPCModuleLoader(IAuthenticationProvider authenticationProvider)
+ {
+ _authenticationProvider = authenticationProvider;
+ AllModules = new ObservableCollection<IPPCModule>();
+ UserModules = new ObservableCollection<IPPCModule>();
+ _authenticationProvider.CurrentUserChanged += _authenticationProvider_CurrentUserChanged;
+ }
+
+ /// <summary>
+ /// Handles the authentication provider user changed event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void _authenticationProvider_CurrentUserChanged(object sender, User e)
+ {
+ LoadModules();
+ }
+
+ private ObservableCollection<IPPCModule> _allModules;
+ /// <summary>
+ /// Gets all loaded modules.
+ /// </summary>
+ public ObservableCollection<IPPCModule> AllModules
+ {
+ get { return _allModules; }
+ private set { _allModules = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<IPPCModule> _userModules;
+ /// <summary>
+ /// Gets all the user permitted modules.
+ /// </summary>
+ public ObservableCollection<IPPCModule> UserModules
+ {
+ get { return _userModules; }
+ private set { _userModules = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Loads all available PPC modules.
+ /// </summary>
+ public void LoadModules()
+ {
+ if (!_loaded)
+ {
+ //Preloaded
+ LogManager.Log(String.Format("Loading module '{0}'...", nameof(JobsModule)));
+ AllModules.Add(new JobsModule());
+ //Preloaded
+
+ AllModules.Clear();
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+
+ foreach (var file in Directory.GetFiles(assemblyFolder, "*.dll").Where(x => x.Contains("Tango.PPC")))
+ {
+ try
+ {
+ Assembly moduleAssembly = null;
+ moduleAssembly = Assembly.LoadFrom(file);
+
+ if (moduleAssembly != null)
+ {
+ foreach (var moduleType in moduleAssembly.GetTypes().Where(x => !x.IsInterface && typeof(IPPCModule).IsAssignableFrom(x) && !x.IsAbstract))
+ {
+ if (!AllModules.ToList().Exists(x => x.GetType() == moduleType))
+ {
+ try
+ {
+ LogManager.Log(String.Format("Loading module '{0}'...", moduleType.Name));
+ var module = Activator.CreateInstance(moduleType) as IPPCModule;
+ AllModules.Add(module);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Could not load module " + moduleType.Name);
+ }
+ }
+ }
+ }
+ }
+ catch { }
+ }
+
+ _loaded = true;
+ }
+
+ AllModules = AllModules.OrderBy(x => x.GetType().GetCustomAttribute<PPCModuleAttribute>().Index).ToObservableCollection();
+
+ UserModules.Clear();
+
+ if (_authenticationProvider.CurrentUser != null)
+ {
+ UserModules = AllModules.Where(x => _authenticationProvider.CurrentUser.HasPermission(x.Permission)).ToObservableCollection();
+ }
+
+ ModulesLoaded?.Invoke(this, new EventArgs());
+ }
+
+ /// <summary>
+ /// Gets the PPC module of type T if loaded.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns></returns>
+ public T GetPPCModule<T>() where T : IPPCModule
+ {
+ return UserModules.OfType<T>().FirstOrDefault();
+ }
+ }
+}