using System; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Security.Permissions; using System.Text; using System.Xml; using Kreta.Framework.Caching; using Kreta.Framework.Exceptions; using Kreta.Framework.Logging; using Kreta.Framework.Session; using SDA.DataProvider; namespace Kreta.Framework { /// /// A kiszolgáló. /// /// /// Az osztály nem engedi meg, hogy egyszerre több példány is létezzen egyidejűleg. /// public abstract class SDAServer : IDisposable { #region Mezők /// /// Szálbiztos védelem az egyedüli példány létrehozásához. /// protected static readonly object SyncClass = new object(); /// /// Szálbiztos védelem. /// protected readonly object Sync = new object(); /// /// A kiszolgáló konfigurációs XML címkéje. /// protected XmlNode ConfigurationNode; /// /// A leállást okozó kivétel. /// Exception _stopException; /// /// Többszörös felszabadítás elleni védelem. /// bool _disposed; #endregion #region Konstruktorok /// /// Az osztály konstruktora. /// protected SDAServer() { const string errorMessage = "There is a running server."; if (Instance != null) { throw new InvalidOperationException(errorMessage); } lock (SyncClass) { if (Instance != null) { throw new InvalidOperationException(errorMessage); } Instance = this; } } /// /// Az osztály konstruktora. /// /// A konfigurációt tartalmazó XmlNode protected SDAServer(XmlNode configNode) : this() { try { ConfigurationNode = configNode ?? throw new ArgumentNullException(nameof(configNode)); } catch { Dispose(); throw; } } #endregion #region Tulajdonságok /// /// A kiszolgáló egyetlen példánya, ha van. /// public static SDAServer Instance { get; protected set; } /// /// A kiszolgáló futási állapota. /// public bool IsRunning { get; private set; } /// /// A kiszolgáló utolsó indítási ideje. /// public DateTime LastStartup { get; private set; } /// /// A kiszolgáló konfigurációja. /// public Configuration Configuration { get; private set; } /// /// A kiszolgáló naplózó funkciókat tartalmazó objektuma. /// public Logger Logger { get; protected set; } /// /// A kiszolgáló munkamenet-kezelő objektuma. /// public SessionManager SessionManager { get; private set; } /// /// A kiszolgáló gyorsítótárait kezelő segédobjektuma. /// public Kreta.Framework.Caching.CacheManager CacheManager { get; private set; } /// /// Session kapcsolatot kezelő szolgáltatás. /// public ConnectionManager ConnectionManager { get; protected set; } #endregion #region Absztrakt tulajdonságok public abstract bool ConsoleEnabled { get; set; } #endregion #region Nyilvános felület /// /// Eldönti hogy egy assembly feldolgozása engedélyezett-e a szerver reflexiós metódusainak. /// /// Az adott assembly. /// ha igen, egyébként. internal protected virtual bool IsAssemblyAllowed(Assembly assembly) { return true; } /// /// Adatbázis kapcsolathoz egy példány létrehozása, zárt állapotban. /// public SDAConnection CreateConnection() { // <> return new SDAConnection(Configuration.DBConnection); } public SDAConnection CreateConnection(string connectionString) { // <> return new SDAConnection(connectionString); } public virtual string GetOrganizationIdentifier() { return string.Empty; } public virtual string GetIntezmenyConnectionString(string intezmenyAzonosito) { return Configuration.DBConnection; } public virtual string GetSystemConnectionString(string intezmenyAzonosito) { return Configuration.DBConnection; } /// /// Karakterlánccá alakítja az objektumot. /// /// /// A karakterlánc tartalmazza a kiszolgáló nevét, hálózati portszámát, állapotát (fut/nem fut). /// /// Az objektumot leíró karakterlánc. public override string ToString() { if (Configuration == null) { return "SDAServer"; } return string.Format( IsRunning ? "{0} (running)" : "{0} (stopped)", Configuration.ServerName); } /// /// A konfiguráció adott nevű tulajdonsága. /// /// A tulajdonság neve. /// A tulajdonság aktuális értéke. public virtual object GetConfigurationParameter(string parametername) { return Configuration.GetType().InvokeMember(parametername, BindingFlags.GetProperty, null, Configuration, null); } #region Indítás, leállítás /// /// Elindítja a kiszolgálót. /// public void Start() { // <