aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.CodeGeneration/EntityInheritedCodeFile.cs
blob: e9c8ac717d7d39b8fcf06a04b4713792d62f4919 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
using System.Windows.Data;
using Tango.Core.DI;
using Tango.Settings;

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 static object _syncObject = new object();
        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>();

            BindingOperations.EnableCollectionSynchronization(UserModules, _syncObject);

            _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()
        {
            var settings = SettingsManager.Default.GetOrCreate<PPCSettings>();

            if (!_loaded)
            {
                //Preloaded
                if (settings.UseJobsModuleV2)
                {
                    LogManager.Log(String.Format("Loading module '{0}'...", nameof(JobsV2Module)));
                    AllModules.Add(new JobsV2Module());
                }
                else
                {
                    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.GetLoadableTypes().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();

            if (settings.UseJobsModuleV2)
            {
                var legacyJobsModule = AllModules.SingleOrDefault(x => x.GetType() == typeof(JobsModule));
                AllModules.Remove(legacyJobsModule);
            }
            else
            {
                var newJobsModule = AllModules.SingleOrDefault(x => x.GetType() == typeof(JobsV2Module));
                AllModules.Remove(newJobsModule);
            }

            UserModules.Clear();

            if (_authenticationProvider.AuthenticationRequired && _authenticationProvider.CurrentUser != null)
            {
                UserModules = AllModules.Where(x => _authenticationProvider.CurrentUser.HasPermission(x.Permission)).ToObservableCollection();
            }
            else if (!_authenticationProvider.AuthenticationRequired)
            {
                UserModules = AllModules.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();
        }
    }
}