using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Sarand.Net.Standard.Base.App; 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 Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.Data; using Saxonite.Net.Core.Web.Base.Consoles; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Consoles; using Saxonite.Net.Standard.Base.Helpers; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Saxonite.Net.Core.Web.Base.App { //======================================================================= public abstract class SaxApplication_Web : SaxApplication_Base { //------------------------------------------------------------------- // Data members. protected Sax.InstanceType instanceType; protected String environmentName = ""; // Session context. protected class SessionContextData_Web { public SessionContextData_Web(SaxSessionContext_Web sessionContext) { SessionContext = sessionContext; } public SaxSessionContext_Web SessionContext { get; } public Dictionary Databases { get; } = new Dictionary(); public ISacsDatabase CoreDatabase { get { return Databases.GetValue(Sax.Database.Core, null); } } public ISacsDatabase ReferenceDatabase { get { return Databases.GetValue(Sax.Database.Reference, null); } } public ISacsDatabase SupportDatabase { get { return Databases.GetValue(Sax.Database.Support, null); } } } //------------------------------------------------------------------- // Protected construction. protected SaxApplication_Web(Sax.Application applicationType) { WebApp = this; System_Web = new SaxSystem_Web(); ApplicationType = applicationType; } protected override void Dispose(bool disposing) { if (disposing) { WebApp = null; System_Web = null; } base.Dispose(disposing); } //------------------------------------------------------------------- // Globals. public static SaxApplication_Web WebApp { get; private set; } public Sax.Application ApplicationType { get; } public override SaxSystem System { get { return System_Web; } } public SaxSystem_Web System_Web { get; private set; } // Application instance. public override Sax.InstanceType InstanceType { get { return instanceType; } } public override String EnvironmentName { get { return environmentName; } } public bool Development { get; protected set; } public String LoggingRootFolder { get; protected set; } = ""; // Application components. public abstract String SessionCookieName { get; } public virtual SaxSessionContext SessionContext { get; protected set; } public abstract SaxAppConfig AppConfig { get; } public SaxConsoleHelper_Web ConsoleHelper_Web { get; protected set; } public override IDatabaseInfo CreateDbInfo(SaxSessionContext sessionContext, Sax.Database databaseType) { return new DbDataItem.DatabaseInfo(GetDatabase(sessionContext, databaseType)); } // Configuration. public IConfiguration Configuration { get; protected set; } public IConfiguration SaxConfiguration { get; private set; } //------------------------------------------------------------------- protected void InitEnvironment(IWebHostEnvironment env, String logFilenamePrefix) { Development = env.IsDevelopment(); environmentName = env.EnvironmentName; SaxConfiguration = LoadApplicationConfiguration(); // Configure logging. SaLogger.LogFilenamePrefix = logFilenamePrefix; SaLogger.IncludeHostInFileMessage = false; SaLogger.IncludeUserInFileMessage = false; //Messages.Add($"Host: {SaxSystem.ComputerName}"); //Messages.Add($"Config file: appsettings.machine.{SaxSystem.ComputerName}.json"); } //------------------------------------------------------------------- // Application configuration. private IConfiguration LoadApplicationConfiguration() { // Load configuration resource files. // Later files override values from previous. var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddEnvironmentVariables(); // Saxonite Web configuration - shared by all applications. Stream configStream = SaxResourceHelper.GetResourceStream("appsettings.json", "Config"); if (configStream != null) builder.AddJsonStream(configStream); configStream = SaxResourceHelper.GetResourceStream($"appsettings.{environmentName}.json", "Config"); if (configStream != null) builder.AddJsonStream(configStream); configStream = SaxResourceHelper.GetResourceStream($"appsettings.machine.{SaxSystem.ComputerName}.json", "Config"); if (configStream != null) builder.AddJsonStream(configStream); // Application specific configuration. builder .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: false) .AddJsonFile($"appsettings.machine.{SaxSystem.ComputerName}.json", optional: true, reloadOnChange: false); return builder.Build(); } //------------------------------------------------------------------- // Database configuration. protected void ConfigureDatabaseConnection(SessionContextData_Web sessionContextData, Sax.Database databaseInstance) { // 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.Password = databaseConfig.Password; SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config); if (database.HasErrorState()) SaLogger.Warn(SysUtil.Fn + " " + databaseInstance.ToString() + " Database initialisation error: " + database.ErrorStateMessage); sessionContextData.Databases.Add(databaseInstance, database); } //------------------------------------------------------------------- // Logging. protected void LogApplicationStart(String fn) { // Log application start. List applicationParams = new List(); applicationParams.Add("Host", SaxSystem.ComputerName); applicationParams.Add("Version", Sax.Version.GetFullVersion()); applicationParams.Add("Instance", InstanceType.ToString() + (!StringUtil.IsEmpty(AppConfig.Instance) ? " [" + AppConfig.Instance + "]" : "")); applicationParams.Add("Configuration", SaxSystem.DebugMode ? "Debug" : "Release"); applicationParams.Add("Environment", EnvironmentName); if (!StringUtil.IsBlank(AppConfig.Databases.Core.Location)) applicationParams.Add("Database - Core", AppConfig.Databases.Core.Location); if (!StringUtil.IsBlank(AppConfig.Databases.Reference.Location)) applicationParams.Add("Database - Reference", AppConfig.Databases.Reference.Location); if (!StringUtil.IsBlank(AppConfig.Databases.Support.Location)) applicationParams.Add("Database - Support", AppConfig.Databases.Support.Location); applicationParams.Add("Application root", SaxSystem.ApplicationFolder); if (!StringUtil.IsEmpty(AppConfig.Documents.RootFolder)) applicationParams.Add("Documents root", AppConfig.Documents.RootFolder); applicationParams.Add("Email context", AppConfig.Email.Context + (!StringUtil.IsEmpty(EmailConfig.SMTP.Server) ? " [" + EmailConfig.SMTP.Server + "]" : "")); SaLogger.Info(fn + " Application start." + applicationParams.Select(item => StringUtil.PadRight(item.Item1 + ":", 23, ' ') + " " + item.Item2).Concat("", "\n\t"), true); if (StringUtil.IsEmpty(EmailConfig.SMTP.Server) || StringUtil.IsEmpty(EmailConfig.Message.AddressFrom)) SaLogger.Warn(fn + " Incomplete email configuration.", true); } //------------------------------------------------------------------- protected void InitialiseTemporaryLoggingFolder() { // Default logging folder - in case of startup failure. try { foreach (String folder in new String[] { @"D:\Sarand\Projects\User\AHoward\VS2017\Saxonite\Logs" }) { if (DirectoryUtil.DirectoryExists(folder)) { SaLogger.LogFolder = folder; break; } } } catch (Exception) { } } //------------------------------------------------------------------- } //======================================================================= }