using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml; using C4IT.FASD.Base; using C4IT.XML; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Config { public class cF4SDCustomDialogConfig : cFasdBaseConfig, IXmlConfigNode { private const string constFileNameFasdConfig = "F4SD-CustomDialog-Configuration.xml"; private const string constFileNameFasdConfigSchema = "F4SD-CustomDialog-Configuration.xsd"; private const string constConfigRootElement = "F4SD-CustomDialog-Configuration"; public static cF4SDCustomDialogConfig Instance { get; set; } public IXmlConfigNode ParentNode { get; set; } public Dictionary GlobalComputations { get; set; } = new Dictionary(); public Dictionary CustomDialogContainers { get; set; } = new Dictionary(); public cF4SDCustomDialogConfig() : base(constFileNameFasdConfig, constFileNameFasdConfigSchema, constConfigRootElement) { } public override bool InstantiateProperties(XmlElement RootElement, cXmlParser Parser) { bool output = false; try { if (RootElement is null || Parser is null) return false; GlobalComputations = cF4SDHealthCardConfig.GetComputationsOfNode(RootElement, Parser, "Global-Computations"); var customDialogsNode = RootElement.SelectSingleNode("CustomDialogs"); if (customDialogsNode != null && customDialogsNode is XmlElement customDialogsElement) { Parser.EnterElement("CustomDialogs"); var stateContainerNodes = customDialogsElement.SelectNodes("State-Container"); if (stateContainerNodes != null) { Parser.EnterElement("State-Container"); foreach (var stateContainerNode in stateContainerNodes) { try { if (!(stateContainerNode is XmlElement stateContainerElement)) continue; var tempStateContainer = new cHealthCardStateContainer(stateContainerElement, Parser, this); if (tempStateContainer is null || tempStateContainer.IsValid is false) continue; if(string.IsNullOrEmpty(tempStateContainer.Name)) { Parser.AddInvalidAttribute(stateContainerElement, null, "Name", C4IT.Logging.LogLevels.Warning); continue; } if (CustomDialogContainers.ContainsKey(tempStateContainer.Name)) Parser.AddDuplicateName(stateContainerElement, tempStateContainer.Name, C4IT.Logging.LogLevels.Warning); else CustomDialogContainers.Add(tempStateContainer.Name, tempStateContainer); } catch (Exception E) { LogException(E); } finally { Parser.SelectElementNext(); } } Parser.LeaveElement("State-Container"); } Parser.LeaveElement("CustomDialogs"); } output = true; } catch (Exception E) { LogException(E); } return output; } public HashSet GetRequiredTables(List informationClasses) { HashSet output = new HashSet(); try { foreach (var customDialog in CustomDialogContainers.Values .Where(dialog => dialog.InformationClasses?.Count == 0 || informationClasses.All(informationClass => dialog.InformationClasses.Contains(informationClass)))) { foreach (var state in customDialog.StateContainerElements) { state.GetRequiredTables().ForEach(table => output.Add(table)); } } //Get all tables which are required for computations string computationPrefix = "Computation_"; while (output.Any(tableName => tableName.StartsWith(computationPrefix))) { string tableName = output.First(name => name.StartsWith(computationPrefix)); string computationName = tableName.Substring(computationPrefix.Length); var computation = cF4SDHealthCardConfig.GetComputationsWithName(this, computationName); if (computation?.Values?.Length > 0) { foreach (var computationValue in computation.Values) { if (computationValue.ValueTable != null) output.Add(computationValue.ValueTable); } } output.Remove(tableName); } } catch (Exception E) { LogException(E); } return output; } } }