Skip to content

Commit

Permalink
Outlines now also work for multi data sources #207
Browse files Browse the repository at this point in the history
  • Loading branch information
Kittyfisto committed Jul 20, 2019
1 parent eafa137 commit 9f3f763
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 11 deletions.
1 change: 1 addition & 0 deletions src/Tailviewer.Test/Tailviewer.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@
<Compile Include="Ui\Controls\QuickNavigation\DataSourceSuggestionViewModelTest.cs" />
<Compile Include="Ui\Controls\QuickNavigation\QuickNavigationViewModelTest.cs" />
<Compile Include="Ui\Controls\SidePanel\BookmarksViewModelTest.cs" />
<Compile Include="Ui\Controls\SidePanel\Outline\OutlineViewModelTest.cs" />
<Compile Include="Ui\Controls\SidePanel\TimeFilter\TimeFiltersViewModelTest.cs" />
<Compile Include="Ui\Controls\TextCanvasTest.cs" />
<Compile Include="Ui\Controls\TextLineTest.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using Tailviewer.Archiver.Plugins;
using Tailviewer.BusinessLogic.DataSources;
using Tailviewer.BusinessLogic.LogFiles;
using Tailviewer.Core;
using Tailviewer.Ui.Controls.SidePanel.Outline;
using Tailviewer.Ui.Outline;

namespace Tailviewer.Test.Ui.Controls.SidePanel.Outline
{
[TestFixture]
[Apartment(ApartmentState.STA)]
public sealed class OutlineViewModelTest
{
private ServiceContainer _services;
private PluginRegistry _pluginLoader;

[SetUp]
public void Setup()
{
_services = new ServiceContainer();
_pluginLoader = new PluginRegistry();
_services.RegisterInstance<IPluginLoader>(_pluginLoader);
}

[Test]
public void TestMultiSource()
{
var plugin = new Mock<ILogFileOutlinePlugin>();
plugin.Setup(x => x.SupportedFileNames).Returns(new[] {new Regex(@"Apache\.log"),});
plugin.Setup(x => x.CreateViewModel(It.IsAny<IServiceContainer>(), It.IsAny<ILogFile>()))
.Returns(new Mock<ILogFileOutlineViewModel>().Object);

var pluginContent = new FrameworkElement();
plugin.Setup(x => x.CreateContentPresenterFor(It.IsAny<IServiceContainer>(),
It.IsAny<ILogFileOutlineViewModel>()))
.Returns(pluginContent);
_pluginLoader.Register(plugin.Object);

var viewModel = new OutlineViewModel(_services);

var dataSource = new Mock<IMultiDataSource>();
var logFile = new Mock<ILogFile>();
dataSource.Setup(x => x.UnfilteredLogFile).Returns(logFile.Object);
dataSource.Setup(x => x.OriginalSources).Returns(new[]{CreateDataSource(fileName: "Foo"), CreateDataSource(fileName: "Apache.log")});

viewModel.CurrentContent.Should().BeNull();
viewModel.CurrentDataSource.Should().BeNull();

viewModel.CurrentDataSource = dataSource.Object;
plugin.Verify(x => x.CreateViewModel(_services, logFile.Object), Times.Once);
viewModel.CurrentContent.Should().BeSameAs(pluginContent);
}

private IDataSource CreateDataSource(string fileName)
{
var dataSource = new Mock<IDataSource>();
dataSource.Setup(x => x.FullFileName).Returns(fileName);
return dataSource.Object;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Tailviewer.Ui.Controls.SidePanel.Outline">
xmlns:local="clr-namespace:Tailviewer.Ui.Controls.SidePanel.Outline"
xmlns:controls="clr-namespace:Metrolib.Controls;assembly=Metrolib">

<DataTemplate DataType="{x:Type local:OutlineViewModel}">
<Border Background="White">
Expand All @@ -18,9 +19,10 @@
Margin="8,0,0,0" />
</Grid>

<ContentPresenter Grid.Row="1"
Margin="8,0,8,8"
Content="{Binding CurrentContent}" />
<controls:FlatScrollViewer Grid.Row="1">
<ContentPresenter Margin="8,0,8,8"
Content="{Binding CurrentContent}" />
</controls:FlatScrollViewer>
</Grid>
</Border>
</DataTemplate>
Expand Down
33 changes: 26 additions & 7 deletions src/Tailviewer/Ui/Controls/SidePanel/Outline/OutlineViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -109,24 +110,34 @@ private LogFileOutlineViewModelProxy GetOrCreateViewModel(IDataSource dataSource
[Pure]
private LogFileOutlineViewModelProxy TryCreateViewModelFor(IDataSource dataSource)
{
var fileName = Path.GetFileName(dataSource.FullFileName);
var plugin = FindMatchingPlugin(fileName);
var plugin = FindMatchingPlugin(dataSource);
if (plugin == null)
return null;

return new LogFileOutlineViewModelProxy(plugin, _services, dataSource.UnfilteredLogFile);
}

private ILogFileOutlinePlugin FindMatchingPlugin(string fileName)
private ILogFileOutlinePlugin FindMatchingPlugin(IDataSource dataSource)
{
var plugins = FindMatchingPlugins(fileName);
IReadOnlyList<ILogFileOutlinePlugin> plugins;
if (dataSource is IMultiDataSource multi)
{
var children = multi.OriginalSources ?? Enumerable.Empty<IDataSource>();
plugins = children.SelectMany(x => FindMatchingPlugins(x.FullFileName)).ToList();
}
else
{
var fileName = Path.GetFileName(dataSource.FullFileName);
plugins = FindMatchingPlugins(fileName);
}

if (plugins.Count == 0)
return null;

if (plugins.Count > 1)
{
Log.WarnFormat("There are multiple plugins which claim to provide an outline for '{0}', selecting the first one:\r\n{1}",
fileName,
dataSource.FullFileName,
string.Join("\r\n", plugins.Select(x => string.Format(" {0}", x.GetType().FullName))));
}

Expand All @@ -140,7 +151,15 @@ private IReadOnlyList<ILogFileOutlinePlugin> FindMatchingPlugins(string fileName

private bool Matches(ILogFileOutlinePlugin plugin, string fileName)
{
return plugin.SupportedFileNames.Any(x => x.IsMatch(fileName));
try
{
return plugin.SupportedFileNames.Any(x => x.IsMatch(fileName));
}
catch (Exception e)
{
Log.ErrorFormat("Caught unexpected exception: {0}", e);
return false;
}
}
}
}

0 comments on commit 9f3f763

Please sign in to comment.