static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("No command specified. Please provide command to execute."); } else { var arguments = new InputArguments(args); // Declare namespace to search types in string @namespace = "Aronium.Migration.Commands"; // Get first argument to match CommandAttribute.Name property of decorated type. var firstArg = arguments.GetPeeledKey(args[0]); // Declare command base to use. CommandBase commandBase = null; // Find all classes in specified namespace var commands = from t in Assembly.GetExecutingAssembly().GetTypes() where t.IsClass && t.Namespace == @namespace && !t.IsAbstract && typeof(CommandBase).IsAssignableFrom(t) && t.GetCustomAttributes(typeof(CommandAttribute), false).Any(x => ((CommandAttribute)x).Name.Equals(firstArg, StringComparison.OrdinalIgnoreCase)) select t; if (commands.Any()) { commandBase = Activator.CreateInstance(commands.First()) as CommandBase; if (commandBase != null) { if (commandBase is DataCommandBase) { DataCommandBase.TrySetConnectionParameters(arguments); } commandBase.Run(arguments); } } else { Console.WriteLine("COMMAND NOT RECOGNIZED!\nPLEASE PROVIDE COMMAND TO EXECUTE."); } } }
/// <summary> /// Data consists of lines based on CSV rules (http://en.wikipedia.org/wiki/Comma-separated_values</para>) /// <para>Separator will be auto detected.</para> /// </summary> /// <param name="data"></param> private void initCommands(string data, bool handleDataAsOne) { if (data != prev_data || (data == string.Empty && prev_data == string.Empty)) { datacommands.Clear(); string callname = string.Empty; string callparams = string.Empty; string[] dataLines = new string[1] { string.Empty }; if (!string.IsNullOrEmpty(data)) { dataLines = Utils.SplitCsvLines(data, separator); } if (handleDataAsOne) { dataLines = new string[1]; dataLines[0] = data; } int templateNumber = 0; DataCommandBase dc = new DataCommandBase(); string line = string.Empty; for (int xx = 0; xx < dataLines.Length; xx++) { line = dataLines[xx]; templateNumber = templateNumberFromLine(line); dc = new DataCommandBase(); string[] lineValues = Utils.SplitEscaped(lineFromTemplateLine(line), separator, '"'); if (lineValues.Length == 1) { callname = getCallName(line); if (availableCommandNames.Contains(callname)) { dc = GetCommandInstance(callname, commandTypes); if (dc.GetType() != typeof(DataCommandBase)) { dc.StringTemplate = this; // set dc parameters callparams = getCallParameters(line); List <DataCommandParameterAttribute> attribs = DataCommandParameterAttribute.GetAttributes(dc.GetType()); string parametersString = callparams.Trim(new char[] { '(', ')' }); string[] parameters = Utils.SplitEscaped(parametersString, ',', '"'); for (int ii = 0; ii < parameters.Length; ii++) { Type t = typeof(object); if (attribs.Count > 0) { t = attribs[Utils.Bound(ii, 0, attribs.Count)].PropertyReference.PropertyType; } if (ii < attribs.Count) { if (StringTemplateItem.PropertyTypeSupported(t)) { StringTemplateItem.SetPropertyValue(attribs[ii].PropertyReference, dc, parameters[ii]); } if (StringTemplateItem.PropertyArrayTypeSupported(t)) { // if next property to be set is an array, all remaining parameters will be asigned to this property. StringTemplateItem.SetPropertyValueArray(attribs[ii].PropertyReference, dc, parameters, ii); break; } } } } } } dc.IsLastCommand = (xx == dataLines.Length - 1); dc.LineValues = lineValues; dc.Line = line; dc.Data = data; dc.TemplateNumber = templateNumber; datacommands.Add(dc); } dc.IsLastCommand = true; } }