using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Sarand.Core.Base; using Sarand.Core.IO; using Sarand.OperationsMgr.Core.App; using Sarand.OperationsMgr.Web.Consoles; using Sarand.OperationsMgr.Win.Dbas.App; using Sarand.Win.Dbas.Base; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace Sarand.OperationsMgr.Web.App { //======================================================================= public class SaOperationsMgrWebApp : SacsStateItem, IDisposable { //------------------------------------------------------------------- // Definitions. internal class OpnSessionContext_Web : OpnSessionContext { public OpnSessionContext_Web (ushort sesionContextIndex, Opn.Instance instance) : base(sesionContextIndex) { Instance = instance; } } public class SessionContextConfig { public OpnSessionContext SessionContext { get; internal set; } public String Caption { get; internal set; } public SacsDatabase Database { get; internal set; } = null; } //------------------------------------------------------------------- // Data members. private static SaOperationsMgrWebApp app; private PropertySet properties; private Dictionary sessionContexts = new Dictionary(); //------------------------------------------------------------------- // Construction. public SaOperationsMgrWebApp (IHostingEnvironment env, IConfigurationSection instanceConfig, String initialLogMessage) { app = this; OpnSystem_WinDbas.InitStatics(); ContentRootPath = env.ContentRootPath; IsDevelopment = env.IsDevelopment(); // Locate IIS logs folder. String logsFolder = null; String folder = env.ContentRootPath; DirectoryInfo info = null; while (logsFolder == null && (info = Directory.GetParent(folder)) != null) { folder = info.FullName; logsFolder = folder + Path.DirectorySeparatorChar + "logs" + Path.DirectorySeparatorChar + "LogFiles"; if (!Directory.Exists(logsFolder)) logsFolder = null; } // Configure root logging folder. if (logsFolder != null) { logsFolder = logsFolder + Path.DirectorySeparatorChar + "SaOperationsMgr"; if (FileUtil.ValidateDirectory(logsFolder, true)) LoggingRootFolder = logsFolder; } // Initialise properties. properties = new PropertySet(); // ToDo Web app - Logging properties - by user session? properties.AddProperty("Logging", "Folder", LoggingRootFolder); properties.AddProperty("Logging", "Level", "Info"); properties.AddProperty("Logging", "ExtendedLogging", ""); // Configure logging. Logger.LogFilenamePrefix = "SLM-Web"; Logger.LogFolder = properties.GetPropertyValue("Logging", "Folder"); #if DEBUG Logger.ConsoleLevel = SaMessageLevel.Trace; #endif Logger.LogFileLevel = EnumUtil.StartsWith(properties.GetPropertyValue("Logging", "Level"), SaMessageLevel.Info); Logger.Info(initialLogMessage, true); Logger.Info("Logging level: " + Logger.LogFileLevel); // Initialise global objects. InitGlobals(instanceConfig); } public void Dispose () { app = null; DeinitGlobals(); } //------------------------------------------------------------------- // Properties. public String ContentRootPath { get; } public String LoggingRootFolder { get; } public bool IsDevelopment { get; } //------------------------------------------------------------------- // I n s t a n c e //------------------------------------------------------------------- public static SaOperationsMgrWebApp GetInstance () { return app; } //------------------------------------------------------------------- // S e s s i o n C o n t e x t C o n f i g u r a t i o n s //------------------------------------------------------------------- public List GetSessionContextIndices () { List indices = new List(); foreach (ushort index in sessionContexts.Keys) indices.Add(index); indices.Sort(); return indices; } public SessionContextConfig GetSessionContextConfig (ushort sessionContextIndex) { if (sessionContexts.ContainsKey(sessionContextIndex)) return sessionContexts[sessionContextIndex]; return null; } //------------------------------------------------------------------- // G l o b a l s //------------------------------------------------------------------- private void InitGlobals (IConfigurationSection sessionContextsConfig) { GetSessionContextConfigurations(sessionContextsConfig); OpnGlobals.System = new OpnSystem_WinDbas(properties); OpnGlobals.ConsoleHelper = new OpnConsoleHelper_Web(); } private void GetSessionContextConfigurations (IConfigurationSection sessionContextsConfig) { // Retrieve Session Context configurations. ushort sessionContextConfigIdx = 0; foreach (IConfigurationSection sessionContextCfg in sessionContextsConfig.GetChildren()) { sessionContextConfigIdx++; // Extract instance code. String instanceCode = sessionContextCfg.GetSection("Instance").Value; Opn.Instance instance = OpnSystem.GetInstanceForCode(instanceCode); if ((int)instance < 1) { Logger.Warn("Unrecognised instance code '" + instanceCode + "' in configuration."); continue; } // Configure Session Context. SessionContextConfig sessionContextConfig = new SessionContextConfig(); sessionContextConfig.SessionContext = new OpnSessionContext_Web((ushort)(sessionContextConfigIdx * 100u), instance); sessionContextConfig.Caption = sessionContextCfg.GetSection("Caption").Value; if (StringUtil.IsEmpty(sessionContextConfig.Caption)) sessionContextConfig.Caption = OpnSystem.GetInstanceDesc(instance); // Retrieve database configuration. IConfigurationSection stockDatabaseCfg = sessionContextCfg.GetSection("StockDatabase"); String instanceDbLocation = stockDatabaseCfg.GetSection("Location").Value; Logger.Debug("Instance: " + instanceCode + ". Db location: " + instanceDbLocation); if (StringUtil.IsEmpty(instanceDbLocation)) { Logger.Warn("Blank database location for instance '" + instanceCode + "' in configuration."); continue; } // Configure database connection. SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig(); config.location = instanceDbLocation; config.user = stockDatabaseCfg.GetSection("User").Value; config.pword = stockDatabaseCfg.GetSection("Pword").Value; sessionContextConfig.Database = SacsDatabaseConsole.OpenOdbcDatabase(config); //OpnGlobals.DbConsole.VerifyDatabaseSchema(); // Add session context to list. sessionContexts.Add(sessionContextConfig.SessionContext.Index, sessionContextConfig); } } private void DeinitGlobals () { OpnGlobals.clear(); } //------------------------------------------------------------------- } //======================================================================= }