public void Merge_WithComplexPriority_ShouldWork() { var opt1 = new FlexibleOptions(); opt1.Set("k1", "v1"); opt1.Set("k2", "v2"); opt1.Set("k3", "v3"); opt1.SetAlias("k3", "3", "key3"); var opt2 = new FlexibleOptions(); opt2.Set("k2", "v2.2"); var opt3 = new FlexibleOptions(); opt3.Set("k3", "v3.3"); // opt1 has lower priority var merge = FlexibleOptions.Merge(opt1, opt2, opt3); Assert.NotNull(merge); Assert.Equal(opt1.Get("k1"), merge.Get("k1")); Assert.Equal(opt2.Get("k2"), merge.Get("k2")); Assert.Equal(opt3.Get("k3"), merge.Get("k3")); // alias Assert.Equal(opt3.Get("k3"), merge.Get("key3")); Assert.Equal(opt3.Get("k3"), merge.Get("3")); // opt1 has higher priority merge = FlexibleOptions.Merge(opt2, opt3, opt1); Assert.NotNull(merge); Assert.Equal(opt1.Get("k1"), merge.Get("k1")); Assert.NotEqual(opt2.Get("k2"), merge.Get("k2")); Assert.NotEqual(opt3.Get("k3"), merge.Get("k3")); Assert.Equal(opt1.Get("k2"), merge.Get("k2")); Assert.Equal(opt1.Get("k3"), merge.Get("k3")); // alias Assert.Equal(opt1.Get("k3"), merge.Get("key3")); Assert.Equal(opt1.Get("k3"), merge.Get("3")); // opt1 has higher priority but with null options merge = FlexibleOptions.Merge(null, opt2, null, opt3, opt1, null); Assert.NotNull(merge); Assert.Equal(opt1.Get("k1"), merge.Get("k1")); Assert.NotEqual(opt2.Get("k2"), merge.Get("k2")); Assert.NotEqual(opt3.Get("k3"), merge.Get("k3")); Assert.Equal(opt1.Get("k2"), merge.Get("k2")); Assert.Equal(opt1.Get("k3"), merge.Get("k3")); // alias Assert.Equal(opt1.Get("k3"), merge.Get("key3")); Assert.Equal(opt1.Get("k3"), merge.Get("3")); }
public void Get_CaseInsensitive_ShouldWork () { var expected = "v1"; var opt1 = new FlexibleOptions (); opt1.Set ("key1", expected); Assert.Equal (expected, opt1.Get ("KEY1")); }
public void Get_AsDateTime_ShouldWork() { // datetime without milliseconds var expected = new DateTime(2015, 01, 02, 03, 04, 05); var opt1 = new FlexibleOptions(); opt1.Set("dtAsDateTime", expected); Assert.Equal(expected, opt1.Get <DateTime> ("dtAsDateTime", DateTime.MinValue)); opt1.Set("dtAsString", expected.ToString(System.Globalization.CultureInfo.InvariantCulture)); Assert.Equal(expected, opt1.Get <DateTime> ("dtAsString", DateTime.MinValue)); opt1.Set("dtAsISOString", expected.ToString("o")); Assert.Equal(expected, opt1.Get <DateTime> ("dtAsISOString", DateTime.MinValue)); opt1.Set("dtAsDate", expected.ToString("yyyyMMdd")); Assert.Equal(expected.Date, opt1.Get <DateTime> ("dtAsDate", DateTime.MinValue)); }
public void Get_AsDateTime_ShouldWork () { // datetime without milliseconds var expected = new DateTime (2015, 01, 02, 03, 04, 05); var opt1 = new FlexibleOptions (); opt1.Set ("dtAsDateTime", expected); Assert.Equal (expected, opt1.Get<DateTime> ("dtAsDateTime", DateTime.MinValue)); opt1.Set ("dtAsString", expected.ToString (System.Globalization.CultureInfo.InvariantCulture)); Assert.Equal (expected, opt1.Get<DateTime> ("dtAsString", DateTime.MinValue)); opt1.Set ("dtAsISOString", expected.ToString ("o")); Assert.Equal (expected, opt1.Get<DateTime> ("dtAsISOString", DateTime.MinValue)); opt1.Set ("dtAsDate", expected.ToString ("yyyyMMdd")); Assert.Equal (expected.Date, opt1.Get<DateTime> ("dtAsDate", DateTime.MinValue)); }
public void Get_CaseInsensitive_ShouldWork() { var expected = "v1"; var opt1 = new FlexibleOptions(); opt1.Set("key1", expected); Assert.Equal(expected, opt1.Get("KEY1")); }
public void SetAlias_AllowCaseInsensitiveGet_ShouldWork () { var expected = "v3"; var opt1 = new FlexibleOptions (); opt1.Set ("k3", expected); opt1.SetAlias ("k3", "3", "key3"); Assert.Equal (expected, opt1.Get ("K3")); Assert.Equal (expected, opt1.Get ("KEY3")); }
public void SetAlias_AllowCaseInsensitiveGet_ShouldWork() { var expected = "v3"; var opt1 = new FlexibleOptions(); opt1.Set("k3", expected); opt1.SetAlias("k3", "3", "key3"); Assert.Equal(expected, opt1.Get("K3")); Assert.Equal(expected, opt1.Get("KEY3")); }
public void SetAlias_AllowGet_ShouldWork() { var expected = "v3"; var opt1 = new FlexibleOptions (); opt1.Set ("k3", expected); opt1.SetAlias ("k3", "3", "key3"); Assert.Equal (expected, opt1.Get ("k3")); Assert.Equal (expected, opt1.Get ("key3")); Assert.Equal (expected, opt1.Get ("3")); Assert.True (String.IsNullOrEmpty (opt1.Get ("KEY"))); }
public void SetAlias_AllowGet_ShouldWork() { var expected = "v3"; var opt1 = new FlexibleOptions(); opt1.Set("k3", expected); opt1.SetAlias("k3", "3", "key3"); Assert.Equal(expected, opt1.Get("k3")); Assert.Equal(expected, opt1.Get("key3")); Assert.Equal(expected, opt1.Get("3")); Assert.True(String.IsNullOrEmpty(opt1.Get("KEY"))); }
public FlexibleOptions ParseAppSettings () { // parse local configuration file // display the options listed in the configuration file var localOptions = new FlexibleOptions (); try { var appSettings = System.Configuration.ConfigurationManager.AppSettings; foreach (var k in appSettings.AllKeys) { localOptions.Set (k, appSettings[k]); } } catch (Exception appSettingsEx) { if (ThrownOnError) throw; RaiseErrorEvent (appSettingsEx); } return localOptions; }
private static void CheckConnections(FlexibleOptions options) { // source server if (!String.IsNullOrWhiteSpace(options.Get("source"))) { if (options.Get("source").IndexOf("://") < 1) { options.Set("source", "mongodb://" + options.Get("source")); } var mongoUri = new MongoUrlBuilder(options.Get("source")); if (mongoUri.ConnectTimeout.TotalSeconds < 30) { mongoUri.ConnectTimeout = TimeSpan.FromSeconds(30); } if (mongoUri.SocketTimeout.TotalMinutes < 4) { mongoUri.SocketTimeout = TimeSpan.FromMinutes(4); } if (mongoUri.MaxConnectionIdleTime.TotalSeconds < 30) { mongoUri.MaxConnectionIdleTime = TimeSpan.FromSeconds(30); } // check for missing uri parameters if (!String.IsNullOrWhiteSpace(_sourceUsername) && String.IsNullOrWhiteSpace(mongoUri.Username)) { mongoUri.Username = _sourceUsername; } if (!String.IsNullOrWhiteSpace(_sourcePassword) && String.IsNullOrWhiteSpace(mongoUri.Password)) { mongoUri.Password = _sourcePassword; } if (!String.IsNullOrWhiteSpace(_sourceAuthDatabase) && String.IsNullOrWhiteSpace(mongoUri.AuthenticationSource)) { mongoUri.AuthenticationSource = _sourceAuthDatabase; } options.Set("source", mongoUri.ToString()); } else { options.Set("source", MongoDbContext.BuildConnectionString(_sourceUsername, _sourcePassword, true, true, _sourceServer, 30000, 4 * 60000, _sourceAuthDatabase)); } // check connection try { MongoDbContext.GetServer(options.Get("source")).Ping(); } catch (Exception ex) { logger.Error("Failed to connect to source mongodb server. Uri: {0}. Details: {1}", options.Get("source"), ex.Message); ConsoleUtils.CloseApplication(-111, true); } // target server if (!String.IsNullOrWhiteSpace(options.Get("target"))) { if (options.Get("target").IndexOf("://") < 1) { options.Set("target", "mongodb://" + options.Get("target")); } var mongoUri = new MongoUrlBuilder(options.Get("target")); if (mongoUri.ConnectTimeout.TotalSeconds < 30) { mongoUri.ConnectTimeout = TimeSpan.FromSeconds(30); } if (mongoUri.SocketTimeout.TotalMinutes < 4) { mongoUri.SocketTimeout = TimeSpan.FromMinutes(4); } if (mongoUri.MaxConnectionIdleTime.TotalSeconds < 30) { mongoUri.MaxConnectionIdleTime = TimeSpan.FromSeconds(30); } // check for missing uri parameters if (!String.IsNullOrWhiteSpace(_sourceUsername) && String.IsNullOrWhiteSpace(mongoUri.Username)) { mongoUri.Username = _sourceUsername; } if (!String.IsNullOrWhiteSpace(_sourcePassword) && String.IsNullOrWhiteSpace(mongoUri.Password)) { mongoUri.Password = _sourcePassword; } if (!String.IsNullOrWhiteSpace(_sourceAuthDatabase) && String.IsNullOrWhiteSpace(mongoUri.AuthenticationSource)) { mongoUri.AuthenticationSource = _sourceAuthDatabase; } options.Set("target", mongoUri.ToString()); } else { options.Set("target", MongoDbContext.BuildConnectionString(_targetUsername, _targetPassword, true, true, _targetServer, 30000, 4 * 60000, _targetAuthDatabase)); } // check connection try { MongoDbContext.GetServer(options.Get("target")).Ping(); } catch (Exception ex) { logger.Error("Failed to connect to target mongodb server. Uri: {0}. Details: {1}", options.Get("target"), ex.Message); ConsoleUtils.CloseApplication(-112, true); } }
private static FlexibleOptions parseFile (string content) { var options = new FlexibleOptions (); // detect xml if (content.TrimStart ().StartsWith ("<")) { var xmlDoc = System.Xml.Linq.XDocument.Parse (content); var root = xmlDoc.Descendants ("config").FirstOrDefault (); if (root != null && root.HasElements) { foreach (var i in root.Elements ()) { options.Set (i.Name.ToString (), i.Value); } } } else { var json = Newtonsoft.Json.Linq.JObject.Parse (content); foreach (var i in json) { options.Set (i.Key, i.Value.ToString (Newtonsoft.Json.Formatting.None)); } } return options; }
private static FlexibleOptions ParseCommandLineArguments (string[] args) { var argsOptions = new FlexibleOptions (); if (args != null) { string arg; bool openTag = false; string lastTag = null; for (int ix = 0; ix < args.Length; ix++) { arg = args[ix]; // check for option with key=value sintax (restriction: the previous tag must not be an open tag) // also valid for --key:value bool hasStartingMarker = arg.StartsWith ("-", StringComparison.Ordinal) || arg.StartsWith ("/", StringComparison.Ordinal); int p = arg.IndexOf ('='); if (p > 0 && (hasStartingMarker || !openTag)) { argsOptions.Set (arg.Substring (0, p).Trim ().TrimStart ('-', '/'), arg.Substring (p + 1).Trim ()); lastTag = null; openTag = false; } // search for tag stating with special character // a linux path should be valid: -path /home/file else if (hasStartingMarker && !(openTag && arg[0] == '/')) { lastTag = arg.Trim ().TrimStart ('-', '/'); argsOptions.Set (lastTag, "true"); openTag = true; } // set value of last tag else if (lastTag != null) { argsOptions.Set (lastTag, arg.Trim ()); openTag = false; } } } return argsOptions; }
/// <summary> /// Checks the command line params.<para/> /// arguments format: key=value or --key value /// </summary> /// <param name="args">The args.</param> internal static FlexibleOptions CheckCommandLineParams (string[] args, bool thrownOnError) { FlexibleOptions mergedOptions = null; FlexibleOptions argsOptions = null; FlexibleOptions localOptions = new FlexibleOptions (); FlexibleOptions externalLoadedOptions = null; try { // parse local configuration file // display the options listed in the configuration file try { var appSettings = System.Configuration.ConfigurationManager.AppSettings; foreach (var k in appSettings.AllKeys) { localOptions.Set (k, appSettings[k]); } } catch (Exception appSettingsEx) { if (thrownOnError) throw; GetLogger ().Warn (appSettingsEx); } // parse console arguments // parse arguments like: key=value argsOptions = ParseCommandLineArguments (args); // merge arguments with app.config options. Priority: arguments > app.config mergedOptions = FlexibleOptions.Merge (localOptions, argsOptions); // adjust alias for web hosted configuration file if (String.IsNullOrEmpty (mergedOptions.Get ("config"))) mergedOptions.Set ("config", mergedOptions.Get ("S3ConfigurationPath", mergedOptions.Get ("webConfigurationFile"))); // load and parse web hosted configuration file (priority order: argsOptions > localOptions) string externalConfigFile = mergedOptions.Get ("config", ""); bool configAbortOnError = mergedOptions.Get ("configAbortOnError", true); if (!String.IsNullOrWhiteSpace (externalConfigFile)) { foreach (var file in externalConfigFile.Trim(' ', '\'', '"', '[', ']').Split (',', ';')) { GetLogger ().Debug ("Loading configuration file from {0} ...", externalConfigFile); externalLoadedOptions = FlexibleOptions.Merge (externalLoadedOptions, LoadExtenalConfigurationFile (file.Trim (' ', '\'', '"'), configAbortOnError)); } } } catch (Exception ex) { // initialize log before dealing with exceptions if (mergedOptions != null) InitializeLog (mergedOptions.Get ("logFilename"), mergedOptions.Get ("logLevel", "Info"), InitOptions, mergedOptions); if (thrownOnError) throw; GetLogger ().Error (ex); } // merge options with the following priority: // 1. console arguments // 2. external file with json configuration object (local or web) // 3. local configuration file (app.config or web.config) mergedOptions = FlexibleOptions.Merge (mergedOptions, externalLoadedOptions, argsOptions); // reinitialize log options if different from local configuration file InitializeLog (mergedOptions.Get ("logFilename"), mergedOptions.Get ("logLevel", "Info"), InitOptions, mergedOptions); // return final merged options ProgramOptions = mergedOptions; return mergedOptions; }
private FlexibleOptions ParseFileContent (string content) { var options = new FlexibleOptions (); if (String.IsNullOrEmpty (content)) return options; // prepare content content = content.Trim (); try { // detect xml if (content.StartsWith ("<")) { var xmlDoc = System.Xml.Linq.XDocument.Parse (content); var root = xmlDoc.Descendants ("config").FirstOrDefault (); if (root != null && root.HasElements) { foreach (var i in root.Elements ()) { options.Set (i.Name.ToString (), i.Value); } } } // parse as json else { var json = Newtonsoft.Json.Linq.JObject.Parse (content); foreach (var i in json) { options.Set (i.Key, i.Value.ToString (Newtonsoft.Json.Formatting.None)); } } } catch (Exception ex) { if (ThrownOnError) throw; RaiseErrorEvent (ex); return null; } return options; }
private static FlexibleOptions ParseCommandLineArguments(string[] args) { var argsOptions = new FlexibleOptions (); if (args != null) { string arg; string lastTag = null; for (int ix = 0; ix < args.Length; ix++) { arg = args[ix]; // check for option with key=value sintax // also valid for --key:value int p = arg.IndexOf ('='); if (p > 0) { argsOptions.Set (arg.Substring (0, p).Trim ().TrimStart ('-', '/'), arg.Substring (p + 1).Trim ()); lastTag = null; continue; } // search for tag stating with special character if (arg.StartsWith ("-", StringComparison.Ordinal) || arg.StartsWith ("/", StringComparison.Ordinal)) { lastTag = arg.Trim ().TrimStart ('-', '/'); argsOptions.Set (lastTag, "true"); continue; } // set value of last tag if (lastTag != null) { argsOptions.Set (lastTag, arg.Trim ()); } } } return argsOptions; }
public void Merge_WithComplexPriority_ShouldWork () { var opt1 = new FlexibleOptions (); opt1.Set ("k1", "v1"); opt1.Set ("k2", "v2"); opt1.Set ("k3", "v3"); opt1.SetAlias ("k3", "3", "key3"); var opt2 = new FlexibleOptions (); opt2.Set ("k2", "v2.2"); var opt3 = new FlexibleOptions (); opt3.Set ("k3", "v3.3"); // opt1 has lower priority var merge = FlexibleOptions.Merge (opt1, opt2, opt3); Assert.NotNull (merge); Assert.Equal (opt1.Get ("k1"), merge.Get ("k1")); Assert.Equal (opt2.Get ("k2"), merge.Get ("k2")); Assert.Equal (opt3.Get ("k3"), merge.Get ("k3")); // alias Assert.Equal (opt3.Get ("k3"), merge.Get ("key3")); Assert.Equal (opt3.Get ("k3"), merge.Get ("3")); // opt1 has higher priority merge = FlexibleOptions.Merge (opt2, opt3, opt1); Assert.NotNull (merge); Assert.Equal (opt1.Get ("k1"), merge.Get ("k1")); Assert.NotEqual (opt2.Get ("k2"), merge.Get ("k2")); Assert.NotEqual (opt3.Get ("k3"), merge.Get ("k3")); Assert.Equal (opt1.Get ("k2"), merge.Get ("k2")); Assert.Equal (opt1.Get ("k3"), merge.Get ("k3")); // alias Assert.Equal (opt1.Get ("k3"), merge.Get ("key3")); Assert.Equal (opt1.Get ("k3"), merge.Get ("3")); // opt1 has higher priority but with null options merge = FlexibleOptions.Merge (null, opt2, null, opt3, opt1, null); Assert.NotNull (merge); Assert.Equal (opt1.Get ("k1"), merge.Get ("k1")); Assert.NotEqual (opt2.Get ("k2"), merge.Get ("k2")); Assert.NotEqual (opt3.Get ("k3"), merge.Get ("k3")); Assert.Equal (opt1.Get ("k2"), merge.Get ("k2")); Assert.Equal (opt1.Get ("k3"), merge.Get ("k3")); // alias Assert.Equal (opt1.Get ("k3"), merge.Get ("key3")); Assert.Equal (opt1.Get ("k3"), merge.Get ("3")); }