Lidarr/src/NzbDrone.Core/ThingiProvider/ProviderFactory.cs

191 lines
6.7 KiB
C#
Raw Normal View History

using System;
2013-09-22 05:20:26 +00:00
using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results;
using Microsoft.Extensions.DependencyInjection;
2013-09-22 05:20:26 +00:00
using NLog;
2013-10-13 02:46:36 +00:00
using NzbDrone.Common.Composition;
2013-09-22 05:20:26 +00:00
using NzbDrone.Core.Lifecycle;
using NzbDrone.Core.Messaging.Events;
2014-02-26 05:40:47 +00:00
using NzbDrone.Core.ThingiProvider.Events;
2013-09-22 05:20:26 +00:00
namespace NzbDrone.Core.ThingiProvider
{
public abstract class ProviderFactory<TProvider, TProviderDefinition> : IProviderFactory<TProvider, TProviderDefinition>, IHandle<ApplicationStartedEvent>
where TProviderDefinition : ProviderDefinition, new()
where TProvider : IProvider
{
private readonly IProviderRepository<TProviderDefinition> _providerRepository;
private readonly IServiceProvider _container;
2014-02-26 05:40:47 +00:00
private readonly IEventAggregator _eventAggregator;
2013-09-22 05:20:26 +00:00
private readonly Logger _logger;
2014-01-22 05:22:09 +00:00
protected readonly List<TProvider> _providers;
2013-09-22 05:20:26 +00:00
2013-10-13 02:46:36 +00:00
protected ProviderFactory(IProviderRepository<TProviderDefinition> providerRepository,
IEnumerable<TProvider> providers,
IServiceProvider container,
2014-02-26 05:40:47 +00:00
IEventAggregator eventAggregator,
2013-10-13 02:46:36 +00:00
Logger logger)
2013-09-22 05:20:26 +00:00
{
_providerRepository = providerRepository;
2013-10-13 02:46:36 +00:00
_container = container;
2014-02-26 05:40:47 +00:00
_eventAggregator = eventAggregator;
2013-09-22 05:20:26 +00:00
_providers = providers.ToList();
_logger = logger;
}
public List<TProviderDefinition> All()
{
return _providerRepository.All().ToList();
}
public IEnumerable<TProviderDefinition> GetDefaultDefinitions()
2013-09-23 00:27:00 +00:00
{
foreach (var provider in _providers)
{
var definition = provider.DefaultDefinitions
.OfType<TProviderDefinition>()
.FirstOrDefault(v => v.Name == null || v.Name == provider.GetType().Name);
if (definition == null)
{
definition = new TProviderDefinition()
{
Name = string.Empty,
ConfigContract = provider.ConfigContract.Name,
Implementation = provider.GetType().Name,
Settings = (IProviderConfig)Activator.CreateInstance(provider.ConfigContract)
};
}
SetProviderCharacteristics(provider, definition);
yield return definition;
}
}
public IEnumerable<TProviderDefinition> GetPresetDefinitions(TProviderDefinition providerDefinition)
{
var provider = _providers.First(v => v.GetType().Name == providerDefinition.Implementation);
var definitions = provider.DefaultDefinitions
.OfType<TProviderDefinition>()
.Where(v => v.Name != null && v.Name != provider.GetType().Name)
.ToList();
return definitions;
2013-09-23 00:27:00 +00:00
}
2017-09-04 02:20:56 +00:00
public virtual ValidationResult Test(TProviderDefinition definition)
{
return GetInstance(definition).Test();
}
2016-08-10 18:45:48 +00:00
public object RequestAction(TProviderDefinition definition, string action, IDictionary<string, string> query)
2015-03-29 05:30:58 +00:00
{
2016-08-10 18:45:48 +00:00
return GetInstance(definition).RequestAction(action, query);
2015-03-29 05:30:58 +00:00
}
2013-09-22 05:20:26 +00:00
public List<TProvider> GetAvailableProviders()
{
2013-10-13 02:46:36 +00:00
return Active().Select(GetInstance).ToList();
2013-09-22 05:20:26 +00:00
}
public bool Exists(int id)
{
return _providerRepository.Find(id) != null;
}
2013-09-22 05:20:26 +00:00
public TProviderDefinition Get(int id)
{
return _providerRepository.Get(id);
}
public TProviderDefinition Find(int id)
{
return _providerRepository.Find(id);
}
public virtual TProviderDefinition Create(TProviderDefinition definition)
2013-09-22 05:20:26 +00:00
{
var addedDefinition = _providerRepository.Insert(definition);
_eventAggregator.PublishEvent(new ProviderAddedEvent<TProvider>(definition));
return addedDefinition;
2013-09-22 05:20:26 +00:00
}
public virtual void Update(TProviderDefinition definition)
2013-09-22 05:20:26 +00:00
{
_providerRepository.Update(definition);
_eventAggregator.PublishEvent(new ProviderUpdatedEvent<TProvider>(definition));
2013-09-22 05:20:26 +00:00
}
public void Delete(int id)
{
_providerRepository.Delete(id);
_eventAggregator.PublishEvent(new ProviderDeletedEvent<TProvider>(id));
2013-09-22 05:20:26 +00:00
}
public TProvider GetInstance(TProviderDefinition definition)
2013-09-22 05:20:26 +00:00
{
var type = GetImplementation(definition);
var instance = (TProvider)_container.GetRequiredService(type);
instance.Definition = definition;
SetProviderCharacteristics(instance, definition);
2013-09-22 05:20:26 +00:00
return instance;
}
private Type GetImplementation(TProviderDefinition definition)
{
return _providers.Select(c => c.GetType()).SingleOrDefault(c => c.Name.Equals(definition.Implementation, StringComparison.InvariantCultureIgnoreCase));
}
public void Handle(ApplicationStartedEvent message)
{
_logger.Debug("Initializing Providers. Count {0}", _providers.Count);
RemoveMissingImplementations();
2013-09-22 20:00:29 +00:00
InitializeProviders();
}
2013-09-22 05:20:26 +00:00
2013-09-22 20:00:29 +00:00
protected virtual void InitializeProviders()
{
2013-09-22 05:20:26 +00:00
}
2013-10-13 02:46:36 +00:00
protected virtual List<TProviderDefinition> Active()
{
return All().Where(c => c.Settings.Validate().IsValid).ToList();
}
public void SetProviderCharacteristics(TProviderDefinition definition)
{
GetInstance(definition);
}
public virtual void SetProviderCharacteristics(TProvider provider, TProviderDefinition definition)
{
2015-04-25 16:02:17 +00:00
definition.ImplementationName = provider.Name;
definition.Message = provider.Message;
}
// TODO: Remove providers even if the ConfigContract can't be deserialized (this will fail to remove providers if the settings can't be deserialized).
2013-09-22 05:20:26 +00:00
private void RemoveMissingImplementations()
{
var storedProvider = _providerRepository.All();
2013-09-22 23:40:36 +00:00
foreach (var invalidDefinition in storedProvider.Where(def => GetImplementation(def) == null))
2013-09-22 05:20:26 +00:00
{
2013-09-22 23:40:36 +00:00
_logger.Debug("Removing {0} ", invalidDefinition.Name);
_providerRepository.Delete(invalidDefinition);
2013-09-22 05:20:26 +00:00
}
}
2017-09-04 02:20:56 +00:00
public List<TProviderDefinition> AllForTag(int tagId)
{
return All().Where(p => p.Tags.Contains(tagId))
.ToList();
}
2013-09-22 05:20:26 +00:00
}
2017-09-04 02:20:56 +00:00
}