feat(archival): use PlainText strategy for sources with no extension

This commit is contained in:
Collin M. Barrett 2020-09-26 14:43:06 -05:00
parent 574ed2b1fa
commit dc3f50a3cc
5 changed files with 27 additions and 26 deletions

View file

@ -3,7 +3,7 @@
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
{
internal interface IStreamToTxtConversionStrategy
internal interface IStreamToPlainTextConversionStrategy
{
Stream Convert(IFileSegment fileSegment, CancellationToken cancellationToken);
}

View file

@ -4,7 +4,7 @@
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
{
public class Txt : IStreamToTxtConversionStrategy
public class PlainText : IStreamToPlainTextConversionStrategy
{
public Stream Convert(IFileSegment fileSegment, CancellationToken cancellationToken)
{

View file

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
{
internal static class StreamToPlainTextConversionStrategyFactory
{
private static readonly IDictionary<string, Func<IStreamToPlainTextConversionStrategy>> Strategies =
new Dictionary<string, Func<IStreamToPlainTextConversionStrategy>>
{
{string.Empty, () => new PlainText()},
{".txt", () => new PlainText()}
};
public static TStrategy? GetStrategy<TStrategy>(this IFileSegment segment)
where TStrategy : class, IStreamToPlainTextConversionStrategy
{
return Strategies.TryGetValue(segment.SourceExtension, out var strategy)
? (TStrategy?)strategy()
: default;
}
}
}

View file

@ -1,22 +0,0 @@
using System;
using System.Linq;
using System.Reflection;
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
{
internal static class StreamToTxtConversionStrategyFactory
{
public static TStreamToTxtConversionStrategy? GetStrategy<TStreamToTxtConversionStrategy>(
this IFileSegment segment) where TStreamToTxtConversionStrategy : class, IStreamToTxtConversionStrategy
{
var strategyType = Assembly.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(t =>
typeof(TStreamToTxtConversionStrategy).IsAssignableFrom(t) &&
string.Equals(t.Name, segment.SourceExtension.TrimStart('.'), StringComparison.OrdinalIgnoreCase));
return strategyType is default(Type)
? default
: (TStreamToTxtConversionStrategy)Activator.CreateInstance(strategyType);
}
}
}

View file

@ -40,8 +40,8 @@ public async Task AddFileAsync(IFile file, CancellationToken cancellationToken)
var textStreams = new List<Stream>();
await foreach (var segment in file.Segments.WithCancellation(cancellationToken))
{
var strategy = segment.GetStrategy<IStreamToTxtConversionStrategy>();
if (strategy is default(IStreamToTxtConversionStrategy))
var strategy = segment.GetStrategy<IStreamToPlainTextConversionStrategy>();
if (strategy is default(IStreamToPlainTextConversionStrategy))
{
_logger.LogWarning(
"No stream to txt conversion strategy found for extension {Extension} for target {Target}. Skipping file",