// Copyright © WireMock.Net using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using JetBrains.Annotations; using Stef.Validation; using WireMock.Logging; using WireMock.Matchers; using WireMock.Matchers.Request; namespace WireMock.Server; public partial class WireMockServer { /// [PublicAPI] public event NotifyCollectionChangedEventHandler LogEntriesChanged { add => _logEntriesChanged += value; remove => _logEntriesChanged -= value; } /// [PublicAPI] public IEnumerable LogEntries => new ReadOnlyCollection(_options.LogEntries.ToList()); /// /// The search log-entries based on matchers. /// /// The matchers. /// The . [PublicAPI] public IEnumerable FindLogEntries(params IRequestMatcher[] matchers) { Guard.NotNull(matchers); var results = new Dictionary(); foreach (var log in _options.LogEntries.ToList()) { var requestMatchResult = new RequestMatchResult(); foreach (var matcher in matchers) { matcher.GetMatchingScore(log.RequestMessage, requestMatchResult); } if (requestMatchResult.AverageTotalScore > MatchScores.AlmostPerfect) { results.Add(log, requestMatchResult); } } return new ReadOnlyCollection(results.OrderBy(x => x.Value).Select(x => x.Key).ToList()); } /// [PublicAPI] public void ResetLogEntries() { _options.LogEntries.Clear(); } /// [PublicAPI] public bool DeleteLogEntry(Guid guid) { // Check a LogEntry exists with the same GUID, if so, remove it. var existing = _options.LogEntries.ToList().FirstOrDefault(m => m.Guid == guid); if (existing != null) { _options.LogEntries.Remove(existing); return true; } return false; } private NotifyCollectionChangedEventHandler? _logEntriesChanged; private void LogEntries_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { if (_logEntriesChanged is { }) { foreach (var handler in _logEntriesChanged.GetInvocationList()) { try { handler.DynamicInvoke(this, e); } catch (Exception exception) { _options.Logger.Error("Error calling the LogEntriesChanged event handler: {0}", exception.Message); } } } } }