Example #1
0
        public static RepositoryInstance Start(RepositoryBuilder builder)
        {
            // Required early configuration
            BlobStorageComponents.DataProvider     = Providers.Instance.BlobMetaDataProvider;
            BlobStorageComponents.ProviderSelector = Providers.Instance.BlobProviderSelector;

            var initialData = builder.InitialData;

            if (initialData != null)
            {
                DataStore.InstallInitialDataAsync(initialData, CancellationToken.None)
                .GetAwaiter().GetResult();
            }

            RepositoryInstance repositoryInstance = null;
            var exclusiveLockOptions = builder.Services?.GetService <IOptions <ExclusiveLockOptions> >()?.Value;

            ExclusiveBlock.RunAsync("SenseNet.PatchManager", Guid.NewGuid().ToString(),
                                    ExclusiveBlockType.WaitAndAcquire, exclusiveLockOptions, CancellationToken.None, () =>
            {
                var logger       = Providers.Instance.GetProvider <ILogger <SnILogger> >();
                var patchManager = new PatchManager(builder, logRecord => { logRecord.WriteTo(logger); });
                patchManager.ExecutePatchesOnBeforeStart();

                repositoryInstance = Start((RepositoryStartSettings)builder);

                var permissions = initialData?.Permissions;
                if (permissions != null && permissions.Count > 0)
                {
                    SecurityHandler.SecurityInstaller.InstallDefaultSecurityStructure(initialData);
                }

                var indexingEngine = Providers.Instance.SearchEngine.IndexingEngine;
                if (indexingEngine.Running && initialData?.IndexDocuments != null)
                {
                    indexingEngine.ClearIndexAsync(CancellationToken.None)
                    .ConfigureAwait(false).GetAwaiter().GetResult();
                    indexingEngine.WriteIndexAsync(null, null,
                                                   initialData.IndexDocuments, CancellationToken.None)
                    .ConfigureAwait(false).GetAwaiter().GetResult();
                }

                patchManager.ExecutePatchesOnAfterStart();
                RepositoryVersionInfo.Reset();

                return(System.Threading.Tasks.Task.CompletedTask);
            }).GetAwaiter().GetResult();

            return(repositoryInstance);
        }
Example #2
0
        public static RepositoryInstance Start(RepositoryBuilder builder)
        {
            var connectionStrings = builder.Services?.GetRequiredService <IOptions <ConnectionStringOptions> >();

            Providers.Instance.InitializeBlobProviders(connectionStrings?.Value ?? new ConnectionStringOptions());

            EnsureDatabase(builder);

            var initialData = builder.InitialData;

            if (initialData != null)
            {
                Providers.Instance.DataStore.InstallInitialDataAsync(initialData, CancellationToken.None)
                .GetAwaiter().GetResult();
            }

            RepositoryInstance repositoryInstance = null;
            var exclusiveLockOptions = builder.Services?.GetService <IOptions <ExclusiveLockOptions> >()?.Value;

            ExclusiveBlock.RunAsync("SenseNet.PatchManager", Guid.NewGuid().ToString(),
                                    ExclusiveBlockType.WaitAndAcquire, exclusiveLockOptions, CancellationToken.None, () =>
            {
                var logger       = Providers.Instance.GetProvider <ILogger <SnILogger> >();
                var patchManager = new PatchManager(builder, logRecord => { logRecord.WriteTo(logger); });
                patchManager.ExecutePatchesOnBeforeStart();

                repositoryInstance = Start((RepositoryStartSettings)builder);

                var permissions = initialData?.Permissions;
                if (permissions != null && permissions.Count > 0)
                {
                    new SecurityInstaller(Providers.Instance.SecurityHandler, Providers.Instance.StorageSchema,
                                          Providers.Instance.DataStore).InstallDefaultSecurityStructure(initialData);
                }

                var indexingEngine = Providers.Instance.SearchEngine.IndexingEngine;
                if (indexingEngine.Running)
                {
                    if (initialData?.IndexDocuments != null)
                    {
                        // Build the index from an in-memory structure. This is a developer use case.
                        indexingEngine.ClearIndexAsync(CancellationToken.None)
                        .ConfigureAwait(false).GetAwaiter().GetResult();
                        indexingEngine.WriteIndexAsync(null, null,
                                                       initialData.IndexDocuments, CancellationToken.None)
                        .ConfigureAwait(false).GetAwaiter().GetResult();
                    }
                    else
                    {
                        // make sure the index exists and contains documents
                        EnsureIndex(builder);
                    }
                }

                patchManager.ExecutePatchesOnAfterStart();
                RepositoryVersionInfo.Reset();

                return(System.Threading.Tasks.Task.CompletedTask);
            }).GetAwaiter().GetResult();

            return(repositoryInstance);
        }