192 lines
8.5 KiB
C#
192 lines
8.5 KiB
C#
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<Sax.Database, ISacsDatabase> Databases { get; } = new Dictionary<Sax.Database, ISacsDatabase>();
|
|
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<StringPair> applicationParams = new List<StringPair>();
|
|
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) { }
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|