コード例 #1
0
        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"));
        }
コード例 #2
0
        public void Get_CaseInsensitive_ShouldWork ()
        {
            var expected = "v1";

            var opt1 = new FlexibleOptions ();
            opt1.Set ("key1", expected);

            Assert.Equal (expected, opt1.Get ("KEY1"));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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));
        }
コード例 #5
0
        public void Get_CaseInsensitive_ShouldWork()
        {
            var expected = "v1";

            var opt1 = new FlexibleOptions();

            opt1.Set("key1", expected);

            Assert.Equal(expected, opt1.Get("KEY1"));
        }
コード例 #6
0
        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"));            
        }
コード例 #7
0
        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"));
        }
コード例 #8
0
        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")));
        }
コード例 #9
0
        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")));
        }
コード例 #10
0
 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;
 }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
        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;
        }
コード例 #13
0
 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;
 }
コード例 #14
0
        /// <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;
        }
コード例 #15
0
 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;
 }
コード例 #16
0
        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;
        }
コード例 #17
0
        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"));
        }