Files
OperationsMgr-CSharp/SaOperationsMgrWeb/Web/App/SaOperationsMgrWebApp.cs
T

193 lines
7.0 KiB
C#

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<ushort, SessionContextConfig> sessionContexts = new Dictionary<ushort, SessionContextConfig>();
//-------------------------------------------------------------------
// 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<ushort> GetSessionContextIndices ()
{
List<ushort> indices = new List<ushort>();
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();
}
//-------------------------------------------------------------------
}
//=======================================================================
}