Finishes the instance contruction process

This commit is contained in:
Jordan Brown
2018-07-26 17:50:54 -04:00
parent 0dd42616fd
commit d2d201bd53
5 changed files with 64 additions and 20 deletions
@@ -1,4 +1,5 @@
using System.Threading;
using System;
using System.Threading;
using System.Threading.Tasks;
using Tgstation.Server.Host.Models;
@@ -7,7 +7,7 @@ namespace Tgstation.Server.Host.Components
/// <summary>
/// Factory for creating and loading <see cref="IRepository"/>s
/// </summary>
public interface IRepositoryManager
public interface IRepositoryManager : IDisposable
{
/// <summary>
/// Attempt to load the <see cref="IRepository"/> from the default location
@@ -74,7 +74,14 @@ namespace Tgstation.Server.Host.Components
}
/// <inheritdoc />
public void Dispose() => timerCts?.Dispose();
public void Dispose()
{
timerCts?.Dispose();
Watchdog.Dispose();
Chat.Dispose();
RepositoryManager.Dispose();
compileJobConsumer.Dispose();
}
/// <summary>
/// Pull the repository and compile for every set of given <paramref name="minutes"/>
@@ -68,6 +68,11 @@ namespace Tgstation.Server.Host.Components
/// </summary>
readonly ISymlinkFactory symlinkFactory;
/// <summary>
/// The <see cref="IByondInstaller"/> for the <see cref="InstanceFactory"/>
/// </summary>
readonly IByondInstaller byondInstaller;
/// <summary>
/// Construct an <see cref="InstanceFactory"/>
/// </summary>
@@ -82,7 +87,8 @@ namespace Tgstation.Server.Host.Components
/// <param name="commandFactory">The value of <see cref="commandFactory"/></param>
/// <param name="synchronousIOManager">The value of <see cref="synchronousIOManager"/></param>
/// <param name="symlinkFactory">The value of <see cref="symlinkFactory"/></param>
public InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, IServerUpdater serverUpdater, ICryptographySuite cryptographySuite, IExecutor executor, ICommandFactory commandFactory, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory)
/// <param name="byondInstaller">The value of <see cref="byondInstaller"/></param>
public InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, IServerUpdater serverUpdater, ICryptographySuite cryptographySuite, IExecutor executor, ICommandFactory commandFactory, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller)
{
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
@@ -95,6 +101,7 @@ namespace Tgstation.Server.Host.Components
this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
}
/// <inheritdoc />
@@ -110,24 +117,53 @@ namespace Tgstation.Server.Host.Components
var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, metadata);
var commandFactory = new CommandFactory(application);
var chatFactory = new ChatFactory(instanceIoManager, loggerFactory, commandFactory);
try
{
var commandFactory = new CommandFactory(application);
var chatFactory = new ChatFactory(instanceIoManager, loggerFactory, commandFactory);
var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager);
var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager);
try
{
var byond = new ByondManager(byondIOManager, byondInstaller, loggerFactory.CreateLogger<ByondManager>());
var configuration = new Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, loggerFactory.CreateLogger<Configuration>());
IByondManager byond = null;
var configuration = new Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, loggerFactory.CreateLogger<Configuration>());
var chat = chatFactory.CreateChat();
var sessionControllerFactory = new SessionControllerFactory(executor, byond, byondTopicSender, interopRegistrar, cryptographySuite, application, gameIoManager, chat, loggerFactory, metadata);
var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, metadata);
var watchdogFactory = new WatchdogFactory(chat, sessionControllerFactory, serverUpdater, loggerFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, metadata);
var watchdog = watchdogFactory.CreateWatchdog(dmbFactory, metadata.DreamDaemonSettings);
var chat = chatFactory.CreateChat();
try
{
var sessionControllerFactory = new SessionControllerFactory(executor, byond, byondTopicSender, interopRegistrar, cryptographySuite, application, gameIoManager, chat, loggerFactory, metadata);
var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, metadata);
var watchdogFactory = new WatchdogFactory(chat, sessionControllerFactory, serverUpdater, loggerFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, metadata);
var watchdog = watchdogFactory.CreateWatchdog(dmbFactory, metadata.DreamDaemonSettings);
try
{
var dreamMaker = new DreamMaker(byond, ioManager, configuration, sessionControllerFactory, dmbFactory, application, watchdog, loggerFactory.CreateLogger<DreamMaker>());
var dreamMaker = new DreamMaker(byond, ioManager, configuration, sessionControllerFactory, dmbFactory, application, watchdog, loggerFactory.CreateLogger<DreamMaker>());
throw new NotImplementedException();
//return new Instance(metadata, repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory);
return new Instance(metadata, repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory);
}
catch
{
watchdog.Dispose();
throw;
}
}
catch
{
chat.Dispose();
throw;
}
}
catch
{
repoManager.Dispose();
throw;
}
}
catch
{
dmbFactory.Dispose();
throw;
}
}
}
}
@@ -8,7 +8,7 @@ using Tgstation.Server.Host.IO;
namespace Tgstation.Server.Host.Components
{
/// <inheritdoc />
sealed class RepositoryManager : IRepositoryManager, IDisposable
sealed class RepositoryManager : IRepositoryManager
{
/// <summary>
/// The <see cref="IIOManager"/> for the <see cref="RepositoryManager"/>