mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 17:25:32 +00:00
85 lines
2.9 KiB
C#
85 lines
2.9 KiB
C#
using System.Timers;
|
|
|
|
namespace HaWeb.FileHelpers;
|
|
|
|
public class ConfigurationMonitor {
|
|
private System.Timers.Timer? _timer;
|
|
private string[] _paths;
|
|
private (string, byte[])[]? _h;
|
|
private IServiceProvider _serviceProvider;
|
|
|
|
public ConfigurationMonitor(string[] paths, IServiceProvider services) {
|
|
_paths = paths;
|
|
_h = _getHash(paths);
|
|
_serviceProvider = services;
|
|
}
|
|
|
|
private static (string, byte[])[]? _getHash(string[] paths) {
|
|
if (paths == null || !paths.Any()) return null;
|
|
var ret = new List<(string, byte[])>();
|
|
foreach(var c in paths)
|
|
ret.Add((c, _computeHash(c)));
|
|
return ret.ToArray();
|
|
}
|
|
|
|
private bool isEqual((string, byte[])[]? _h1, (string, byte[])[]? _h2) {
|
|
if (_h1 == null && _h2 == null) return true;
|
|
if (_h1 == null && _h2 != null) return false;
|
|
if (_h2 == null && _h1 != null) return false;
|
|
if (_h1!.Count() != _h2!.Count()) return false;
|
|
foreach (var h1 in _h1!) {
|
|
foreach (var h2 in _h2!) {
|
|
if (h1.Item1 == h2.Item1 && !Enumerable.SequenceEqual(h1.Item2, h2.Item2)) return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void InvokeChanged(IHostEnvironment _) {
|
|
var h = _getHash(_paths);
|
|
if (_timer == null && !isEqual(h, _h)) {
|
|
_h = h;
|
|
_timer = new(8000) { AutoReset = false };
|
|
_timer.Enabled = true;
|
|
_timer.Elapsed += _OnChanged;
|
|
}
|
|
}
|
|
|
|
private void _OnChanged(Object source, System.Timers.ElapsedEventArgs e) {
|
|
Console.WriteLine("Configuration changed (ConfigurationMonitor Class)");
|
|
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
|
IServiceProvider provider = serviceScope.ServiceProvider;
|
|
var cP = provider.GetRequiredService<IConfiguration>();
|
|
var hP = provider.GetRequiredService<IHaDocumentWrappper>();
|
|
hP.ParseConfiguration(cP);
|
|
var fP = provider.GetRequiredService<IXMLFileProvider>();
|
|
fP.ParseConfiguration(cP);
|
|
// _lifetime.StopApplication();
|
|
_timer = null;
|
|
}
|
|
|
|
private static byte[] _computeHash(string filePath) {
|
|
var runCount = 1;
|
|
|
|
while(runCount < 4) {
|
|
try {
|
|
if (File.Exists(filePath))
|
|
using (var fs = File.OpenRead(filePath)) {
|
|
return System.Security.Cryptography.SHA1
|
|
.Create().ComputeHash(fs);
|
|
}
|
|
else {
|
|
throw new FileNotFoundException();
|
|
}
|
|
}
|
|
catch (IOException ex) {
|
|
if (runCount == 3)
|
|
throw;
|
|
|
|
Thread.Sleep(TimeSpan.FromSeconds(Math.Pow(2, runCount)));
|
|
runCount++;
|
|
}
|
|
}
|
|
return new byte[20];
|
|
}
|
|
} |