using C4IT.XML;
using F4SD.ActionConnector.Enumerations;
using System;
using System.Collections.Generic;
using System.Xml;
using static C4IT.Logging.cLogManager;
namespace F4SD.ActionConnector.Models
{
public sealed class QuickActionDefinition : ActionDefinitionBase
{
private const string ParametersNodeName = "Parameters";
private const string ParameterNodeName = "Parameter";
public override ActionType Type => ActionType.QuickAction;
///
/// Reference to the Quick Action to invoke, e.g. "Protocol case in JIRA".
///
public string QuickActionRef { get; internal set; }
public IDictionary Parameters { get; private set; } = new Dictionary();
internal QuickActionDefinition(XmlElement xNode, cXmlParser parser) : base(xNode, parser)
{
try
{
if (!IsValid) return; else IsValid = false;
XmlNode quickActionRefNode = xNode.SelectSingleNode("QuickActionRef");
if (quickActionRefNode is null)
return;
QuickActionRef = cXmlParser.GetInnerTextFromXmlElement(quickActionRefNode);
if (QuickActionRef is null)
return;
XmlNode parametersNode = xNode.SelectSingleNode(ParametersNodeName);
if (parametersNode != null && parametersNode is XmlElement paramtersNodeElement)
ParseParametersElement(paramtersNodeElement, parser);
IsValid = true;
}
catch (Exception ex)
{
LogException(ex);
}
}
private void ParseParametersElement(XmlElement parametersNodeElement, cXmlParser parser)
{
try
{
parser.EnterElement(ParametersNodeName);
XmlNodeList parameterNodes = parametersNodeElement.SelectNodes(ParameterNodeName);
if (parameterNodes?.Count > 0)
parser.EnterElement(ParameterNodeName);
foreach (XmlElement parameterNode in parameterNodes)
{
ParseParameterElement(parameterNode, parser);
}
if (parameterNodes?.Count > 0)
parser.LeaveElement(ParameterNodeName);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
parser.LeaveElement(ParametersNodeName);
}
}
private void ParseParameterElement(XmlElement parameterNode, cXmlParser parser)
{
try
{
string parameterName = cXmlParser.GetStringFromXmlAttribute(parameterNode, "Name");
string parameterVariable = cXmlParser.GetInnerTextFromXmlElement(parameterNode);
if (string.IsNullOrEmpty(parameterName) || string.IsNullOrEmpty(parameterVariable))
return;
if (Parameters.ContainsKey(parameterName))
LogEntry($"A paramter with name '{parameterName}' does allready exist.", C4IT.Logging.LogLevels.Warning);
else
Parameters.Add(parameterName, parameterVariable);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
parser.SelectElementNext();
}
}
}
}