using System; using System.Collections.Generic; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; namespace Sarand.Net.Standard.Base.App { //======================================================================= /// /// Process definitions found on command line. /// Used to automatically run process on start up, and then close application. /// Command line examples: /// app /Process:ExportData /// app /SaProc:ExportData /// app /Proc:ProcId=ExportData;User=uat /// app /SaProcess:Proc=ExportData;User=uat /// public class SacsProcessDefinition { //------------------------------------------------------------------- // Data members. private static List validProcessPrefix = StringListUtil.Split("Proc,Process,SaProc,SaProcess",","); private static List validProcessNameParam = StringListUtil.Split("Proc,Process,ProcId,ProcessId",","); //------------------------------------------------------------------- // Construction. public SacsProcessDefinition (String commandLineArg) { // First field should be a valid process prefix. if (!IsValidProcessDefinition(commandLineArg)) throw new NotSupportedException("SacsProcessDefinition Invalid process command line arg: '" + commandLineArg + "'"); // A single colon is expected. String[] fields = commandLineArg.Split(':'); if (fields.Length != 2) throw new NotSupportedException("SacsProcessDefinition Colon expected in command line arg: '" + commandLineArg + "'"); // Extract process params. String[] processParams = fields[1].Split(';'); foreach (String processParam in processParams) { // Each parameter is either delimited as 'name=value' or is interpretted as the process name if no equals. String[] paramValues = processParam.Split('='); if (paramValues.Length == 1 || (paramValues.Length == 2 && validProcessNameParam.ContainsCI(paramValues[0]))) { // Parameter is the process name. String processName = (paramValues.Length == 1 ? paramValues[0] : paramValues[1]); if (!StringUtil.IsEmpty(ProcessName)) throw new NotSupportedException("SacsProcessDefinition Multiple process names in command line arg: '" + commandLineArg + "'"); ProcessName = processName; } else { if (Params.HasValue(paramValues[0])) throw new NotSupportedException("SacsProcessDefinition Duplicate param name '"+ paramValues[0] + "' in command line arg: '" + commandLineArg + "'"); Params.AddValue(paramValues[0], new DataValue(paramValues[1])); } } } //------------------------------------------------------------------- // Properties. public String ProcessName { get; } public NamedValue.Map Params { get; } = new NamedValue.Map(); //------------------------------------------------------------------- // Utilities. public static bool IsValidProcessDefinition (String commandLineArg) { if (StringUtil.IsEmpty(commandLineArg)) return false; foreach (String validPrefix in validProcessPrefix) { if (commandLineArg.StartsWithCI(validPrefix + ":")) return true; } return false; } //------------------------------------------------------------------- } //======================================================================= public static class SacsProcessDefinitionList { //------------------------------------------------------------------- // Locate process in the list. public static SacsProcessDefinition GetProcessDefinition (this List values, String name) { return values.Find(item => item.ProcessName.EqualsCI(name)); } //------------------------------------------------------------------- } //======================================================================= }