using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Email; using Sarand.Net.Standard.Base.IO; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Consoles; using Saxonite.Net.Core.Web.Online.Consoles; using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Saxonite.Net.Standard.Dbas.App; using Microsoft.Extensions.Hosting; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Utils; namespace Saxonite.Net.Core.Web.Online.App { //======================================================================= public class SaxApplication_Online : SaxApplication_Web { //------------------------------------------------------------------- // Data members. private Dictionary appConfigs = new Dictionary(); private Dictionary emailConfigs = new Dictionary(); // Session contexts. protected class SessionContextData_Online : SessionContextData_Web { public SessionContextData_Online(SaxSessionContext_Web sessionContext) : base(sessionContext) { } } private readonly Dictionary sessionContexts = new Dictionary(); //------------------------------------------------------------------- // Construction. public SaxApplication_Online(IConfiguration configuration) { InitialiseTemporaryLoggingFolder(); try { AppInstance = this; Configuration = configuration; ConsoleHelper_Online = new SaxConsoleHelper_Online(this); } catch (Exception exc) { SaLogger.Error(GetType().Name + ".CTR " + ExceptionUtil.GetErrorStateMessage(exc)); throw; } } protected override void Dispose(bool disposing) { if (disposing) { // Clear globals. AppInstance = null; // Console helper. if (ConsoleHelper_Online!= null) ConsoleHelper_Online.Dispose(); ConsoleHelper_Online= null; } base.Dispose(disposing); } //------------------------------------------------------------------- // Globals. public static SaxApplication_Online AppInstance { get; private set; } public override SaxConsoleHelper ConsoleHelper { get { return ConsoleHelper_Online; } } public SaxConsoleHelper_Online ConsoleHelper_Online { get; private set; } // Database. public override ISacsDatabase GetDatabase(SaxSessionContext sessionContext, Sax.Database databaseType) { return sessionContexts.GetValue(sessionContext.Index, null)?.Databases.GetValue(databaseType, null) ?? null; } // Configuration. public override SaxAppConfig AppConfig { get { return appConfigs.Values.ToList().getConfigForApplication(); } } public override SaxEmailConfig EmailConfig { get { return emailConfigs.Values.ToList().getConfigForSession(AppConfig); } } public override String SessionCookieName { get { return Sax.Config.Online.Session.Cookie.Name; } } //------------------------------------------------------------------- // Initialisation. /// Initialise environment - from Startup. internal void InitWebHostEnvironment(IWebHostEnvironment env) { InitEnvironment(env); } /// Initialise environment - from internal (above) or unit tests. protected void InitEnvironment(IWebHostEnvironment env) { String fn = GetType().Name + ".InitEnvironment"; Development = env.IsDevelopment(); environmentName = env.EnvironmentName; SaLogger.LogFilenamePrefix = "Sax-Web-Onl"; SaLogger.IncludeHostInFileMessage = false; SaLogger.IncludeUserInFileMessage = false; try { // Load server configuration. var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false) .AddJsonFile($"appsettings.machine.{SaxSystem.ComputerName}.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables(); SaxConfiguration = builder.Build(); // Application configuration. appConfigs = SaxAppConfigHelper.ExtractAppConfigs(SaxConfiguration.GetSection("AppConfigs")); emailConfigs = SaxEmailConfigHelper.ExtractEmailConfigs(SaxConfiguration.GetSection("EmailConfigs")); LoggingRootFolder = AppConfig.Logging.RootFolder; // Application instance. if (AppConfig.Instance.EqualsCI("Dev")) instanceType = Sax.InstanceType.Dev; else if (AppConfig.Instance.ContainsCI("Q")) instanceType = Sax.InstanceType.QC; else if (AppConfig.Instance.ContainsCI("UAT")) instanceType = Sax.InstanceType.UAT; else if (AppConfig.Instance.EqualsCI("PreProd")) instanceType = Sax.InstanceType.UAT; // Initialise hard-coded logging path. if (StringUtil.IsEmpty(LoggingRootFolder)) { if (SaxSystem.ComputerName.EqualsCI("WIN-BPCLM1QUOMT")) LoggingRootFolder = @"D:\Saxonite\Logs\" + (Development ? "Dev" : "Test"); } if (DirectoryUtil.DirectoryExists(LoggingRootFolder)) SaLogger.LogFolder = LoggingRootFolder; LogApplicationStart(fn); // Session context - only one context available/necessary (for now). SessionContextData_Online sessionContextData = new SessionContextData_Online(new SaxSessionContext_Web(100, Sax.Application.Online)); ConfigureDatabaseConnection(sessionContextData, Sax.Database.Core); ConfigureDatabaseConnection(sessionContextData, Sax.Database.Support); sessionContexts.Add(sessionContextData.SessionContext.Index, sessionContextData); SessionContext = sessionContextData.SessionContext; // Data Cache console - to initialise refresh. Must be done for every Session Context. SaxDataCacheConsole dataCacheConsole = SaxGlobals.ConsoleHelper.GetDataCacheConsole(SessionContext); } catch (Exception exc) { SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc)); } } //------------------------------------------------------------------- private void ConfigureDatabaseConnection(SessionContextData_Online sessionContextData, Sax.Database databaseInstance) { String fn = GetType().Name + ".ConfigureDatabaseConnection"; // Configure database connection. SaxAppConfig.DatabaseConfig databaseConfig = AppConfig.Databases.Databases.GetValue(databaseInstance, new SaxAppConfig.DatabaseConfig()); SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig(); config.location = databaseConfig.Location; config.user = databaseConfig.User; config.pword = databaseConfig.Password; SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config); if (database.HasErrorState()) SaLogger.Warn(fn + " " + databaseInstance.ToString() + " Database initialisation error: " + database.ErrorStateMessage); sessionContextData.Databases.Add(databaseInstance, database); } //------------------------------------------------------------------- } //======================================================================= }