diff --git a/src/NzbDrone.Core.Test/Datastore/Converters/CommandConverterFixture.cs b/src/NzbDrone.Core.Test/Datastore/Converters/CommandConverterFixture.cs index 995cf106f..127116c33 100644 --- a/src/NzbDrone.Core.Test/Datastore/Converters/CommandConverterFixture.cs +++ b/src/NzbDrone.Core.Test/Datastore/Converters/CommandConverterFixture.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using NzbDrone.Common.Serializer; using NzbDrone.Core.Datastore.Converters; +using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Music.Commands; using NzbDrone.Core.Test.Framework; @@ -50,6 +51,22 @@ namespace NzbDrone.Core.Test.Datastore.Converters Subject.FromDB(context).Should().BeOfType(); } + [Test] + public void should_return_unknown_command_when_getting_json_from_db() + { + var dataRecordMock = new Mock(); + dataRecordMock.Setup(s => s.GetOrdinal("Name")).Returns(0); + dataRecordMock.Setup(s => s.GetString(0)).Returns("MockRemovedCommand"); + + var context = new ConverterContext + { + DataRecord = dataRecordMock.Object, + DbValue = new RefreshArtistCommand(2).ToJson() + }; + + Subject.FromDB(context).Should().BeOfType(); + } + [Test] public void should_return_null_for_null_value_when_getting_from_db() { diff --git a/src/NzbDrone.Core/Datastore/Converters/CommandConverter.cs b/src/NzbDrone.Core/Datastore/Converters/CommandConverter.cs index a6c641206..8d592b775 100644 --- a/src/NzbDrone.Core/Datastore/Converters/CommandConverter.cs +++ b/src/NzbDrone.Core/Datastore/Converters/CommandConverter.cs @@ -29,7 +29,11 @@ namespace NzbDrone.Core.Datastore.Converters if (impType == null) { - throw new CommandNotFoundException(contract); + var result = Json.Deserialize(stringValue); + + result.ContractName = contract; + + return result; } return Json.Deserialize(stringValue, impType); diff --git a/src/NzbDrone.Core/Messaging/Commands/CommandExecutor.cs b/src/NzbDrone.Core/Messaging/Commands/CommandExecutor.cs index 2c9ea763e..18dabae07 100644 --- a/src/NzbDrone.Core/Messaging/Commands/CommandExecutor.cs +++ b/src/NzbDrone.Core/Messaging/Commands/CommandExecutor.cs @@ -69,8 +69,7 @@ namespace NzbDrone.Core.Messaging.Commands try { - var handlerContract = typeof(IExecute<>).MakeGenericType(command.GetType()); - handler = (IExecute)_serviceFactory.Build(handlerContract); + handler = (IExecute)_serviceFactory.Build(typeof(IExecute)); _logger.Trace("{0} -> {1}", command.GetType().Name, handler.GetType().Name); diff --git a/src/NzbDrone.Core/Messaging/Commands/UnknownCommand.cs b/src/NzbDrone.Core/Messaging/Commands/UnknownCommand.cs new file mode 100644 index 000000000..fa579916e --- /dev/null +++ b/src/NzbDrone.Core/Messaging/Commands/UnknownCommand.cs @@ -0,0 +1,11 @@ +namespace NzbDrone.Core.Messaging.Commands +{ + public class UnknownCommand : Command + { + public override bool SendUpdatesToClient => false; + + public override string CompletionMessage => "Skipped"; + + public string ContractName { get; set; } + } +} diff --git a/src/NzbDrone.Core/Messaging/Commands/UnknownCommandExecutor.cs b/src/NzbDrone.Core/Messaging/Commands/UnknownCommandExecutor.cs new file mode 100644 index 000000000..08fb2725d --- /dev/null +++ b/src/NzbDrone.Core/Messaging/Commands/UnknownCommandExecutor.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NLog; + +namespace NzbDrone.Core.Messaging.Commands +{ + public class UnknownCommandExecutor : IExecute + { + private readonly Logger _logger; + + public UnknownCommandExecutor(Logger logger) + { + _logger = logger; + } + + public void Execute(UnknownCommand message) + { + _logger.Debug("Ignoring unknown command {0}", message.ContractName); + } + } +}