public void Setup() { _databaseFileName = Path.GetTempFileName(); _sessionFactory = DataUtility.CreateSessionFactory(_databaseFileName); _tempFolder = Path.GetTempFileName(); File.Delete(_tempFolder); var appDataFolder = AppDataFolderTests.CreateAppDataFolder(_tempFolder); var builder = new ContainerBuilder(); _session = _sessionFactory.OpenSession(); builder.RegisterInstance(appDataFolder).As<IAppDataFolder>(); builder.RegisterType<SqlCeDataServicesProvider>().As<IDataServicesProvider>(); builder.RegisterType<DataServicesProviderFactory>().As<IDataServicesProviderFactory>(); builder.RegisterType<StubReportsCoordinator>().As<IReportsCoordinator>(); builder.RegisterType<DefaultDataMigrationInterpreter>().As<IDataMigrationInterpreter>(); builder.RegisterType<SqlCeCommandInterpreter>().As<ICommandInterpreter>(); builder.RegisterType<SessionConfigurationCache>().As<ISessionConfigurationCache>(); builder.RegisterType<SessionFactoryHolder>().As<ISessionFactoryHolder>(); builder.RegisterType<DefaultDatabaseCacheConfiguration>().As<IDatabaseCacheConfiguration>(); builder.RegisterType<StubHostEnvironment>().As<IHostEnvironment>(); builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As<ISessionLocator>(); builder.RegisterInstance(new ShellBlueprint { Records = Enumerable.Empty<RecordBlueprint>() }).As<ShellBlueprint>(); builder.RegisterInstance(new ShellSettings { Name = "temp", DataProvider = "SqlCe", DataTablePrefix = "TEST" }).As<ShellSettings>(); builder.RegisterModule(new DataModule()); _container = builder.Build(); _interpreter = _container.Resolve<IDataMigrationInterpreter>() as DefaultDataMigrationInterpreter; _schemaBuilder = new SchemaBuilder(_interpreter); }
public string Setup(SetupContext context) { string executionId; // The vanilla Coevery distibution has the following features enabled. string[] hardcoded = { // Framework "Coevery.Framework", // Core "Settings", // Modules "Coevery.Recipes", "Coevery.Users" }; context.EnabledFeatures = hardcoded.Union(context.EnabledFeatures ?? Enumerable.Empty<string>()).Distinct().ToList(); var shellSettings = new ShellSettings(_shellSettings); if (string.IsNullOrEmpty(shellSettings.DataProvider)) { shellSettings.DataProvider = context.DatabaseProvider; shellSettings.DataConnectionString = context.DatabaseConnectionString; shellSettings.DataTablePrefix = context.DatabaseTablePrefix; } #region Encryption Settings shellSettings.EncryptionAlgorithm = "AES"; // randomly generated key shellSettings.EncryptionKey = SymmetricAlgorithm.Create(shellSettings.EncryptionAlgorithm).Key.ToHexString(); shellSettings.HashAlgorithm = "HMACSHA256"; // randomly generated key shellSettings.HashKey = HMAC.Create(shellSettings.HashAlgorithm).Key.ToHexString(); #endregion var shellDescriptor = new ShellDescriptor { Features = context.EnabledFeatures.Select(name => new ShellFeature { Name = name }) }; var shellBlueprint = _compositionStrategy.Compose(shellSettings, shellDescriptor); var f = shellBlueprint.Dependencies.Where(d => d.Type == typeof(RecipeManager)).ToList(); // initialize database explicitly, and store shell descriptor using (var bootstrapLifetimeScope = _shellContainerFactory.CreateContainer(shellSettings, shellBlueprint)) { using (var environment = bootstrapLifetimeScope.CreateWorkContextScope()) { // check if the database is already created (in case an exception occured in the second phase) var schemaBuilder = new SchemaBuilder(environment.Resolve<IDataMigrationInterpreter>()); try { var tablePrefix = String.IsNullOrEmpty(shellSettings.DataTablePrefix) ? "" : shellSettings.DataTablePrefix + "_"; schemaBuilder.ExecuteSql("SELECT * FROM " + tablePrefix + "ShellDescriptorRecord"); } catch { var reportsCoordinator = environment.Resolve<IReportsCoordinator>(); reportsCoordinator.Register("Data Migration", "Setup", "Coevery installation"); schemaBuilder.CreateTable("DataMigrationRecord", table => table .Column<int>("Id", column => column.PrimaryKey().Identity()) .Column<string>("DataMigrationClass") .Column<int>("Version")); var dataMigrationManager = environment.Resolve<IDataMigrationManager>(); dataMigrationManager.Update("Settings"); foreach (var feature in context.EnabledFeatures) { dataMigrationManager.Update(feature); } environment.Resolve<IShellDescriptorManager>().UpdateShellDescriptor( 0, shellDescriptor.Features, shellDescriptor.Parameters); } } } // in effect "pump messages" see PostMessage circa 1980 while ( _processingEngine.AreTasksPending() ) _processingEngine.ExecuteNextTask(); // creating a standalone environment. // in theory this environment can be used to resolve any normal components by interface, and those // components will exist entirely in isolation - no crossover between the safemode container currently in effect // must mark state as Running - otherwise standalone enviro is created "for setup" shellSettings.State = TenantState.Running; using (var environment = _coeveryHost.CreateStandaloneEnvironment(shellSettings)) { try { executionId = CreateTenantData(context, environment); } catch { environment.Resolve<ITransactionManager>().Cancel(); throw; } } _shellSettingsManager.SaveSettings(shellSettings); return executionId; }