Пример #1
0
        public static void ConfigAndWatch(IXmlConfig configEntity, FileInfo configFile)
        {
            Logger.Debug($"Config and watch file:{configFile}");

            if (configFile == null)
            {
                Logger.Debug($"Configure called with null 'configFile' parameter");
                return;
            }

            if (configEntity == null)
            {
                Logger.Debug($"Configure called with null 'configEntity' parameter");
                return;
            }

            InternalConfigure(configEntity, configFile);
            try
            {
                lock (Configurators)
                {
                    if (Configurators.TryGetValue(configFile.FullName, out var handler))
                    {
                        handler?.Dispose();
                    }

                    Configurators[configFile.FullName] = new XmlConfigurator(configEntity, configFile);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(
                    $"Failed to initialize configuration file watcher for the file:{configFile.FullName}, due to:{ex}");
            }
        }
Пример #2
0
        private static void InternalConfigure(IXmlConfig configEntity, FileInfo configFile)
        {
            if (configFile == null)
            {
                Logger.Debug($"Configure called with null 'configFile' parameter");
                return;
            }

            Logger.Debug($"Configuring file:{configFile.FullName}");

            if (File.Exists(configFile.FullName))
            {
                FileStream fileStream = null;
                for (var retry = 5; --retry >= 0;)
                {
                    try
                    {
                        fileStream = configFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
                        break;
                    }
                    catch (IOException ex)
                    {
                        if (retry == 0)
                        {
                            Logger.Error($"Failed to open XML config file:{configFile.FullName}, due to:{ex}");

                            // The stream cannot be valid
                            fileStream = null;
                        }

                        Thread.Sleep(250);
                    }
                }

                if (fileStream == null)
                {
                    return;
                }
                try
                {
                    // Load the configuration from the stream
                    InternalConfigure(configEntity, fileStream);
                }
                finally
                {
                    // Force the file closed whatever happens
                    fileStream.Close();
                }
            }
            else
            {
                Logger.Debug($"Config file {configFile.FullName} not found. Configuration unchanged.");
            }
        }
Пример #3
0
        private XmlConfigurator(IXmlConfig configEntity, FileInfo configFile)
        {
            _configFile      = configFile;
            _xmlConfigEntity = configEntity;

            _watcher = new FileSystemWatcher
            {
                Path         = _configFile.DirectoryName,
                Filter       = _configFile.Name,
                NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName
            };

            _watcher.Changed += ConfigFileChangedHandler;
            _watcher.Created += ConfigFileChangedHandler;
            _watcher.Deleted += ConfigFileChangedHandler;
            _watcher.Renamed += ConfigFileRenamedHandler;

            _watcher.EnableRaisingEvents = true;

            _timer = new Timer(OnConfigFileChanged, null, Timeout.Infinite, Timeout.Infinite);
        }
Пример #4
0
        private static void InternalConfigure(IXmlConfig configEntity, FileStream fileStream)
        {
            if (fileStream == null)
            {
                Logger.Debug($"Configure called with null 'fileStream' parameter");
                return;
            }

            if (configEntity == null)
            {
                Logger.Debug($"Configure called with null 'configEntity' parameter");
                return;
            }

            var xmlDoc = new XmlDocument();

            try
            {
                var settings = new XmlReaderSettings
                {
                    DtdProcessing = DtdProcessing.Parse
                };

                using (var xmlReader = XmlReader.Create(fileStream, settings))
                {
                    xmlDoc.Load(xmlReader);
                }
            }
            catch (Exception ex)
            {
                Logger.Error($"Error while loading XML configuration, due to:{ex}");
                xmlDoc = null;
            }

            if (xmlDoc != null)
            {
                Logger.Debug($"Loading XML configuration.");
                configEntity.Config(xmlDoc.DocumentElement);
            }
        }