public SearchEngine(
            EventReactor eventReactor,
            IFileIndexer indexer,
            IIndexEjector indexEjector,
            IFileSupervisor supervisor,
            ISearcher searcher,
            IScheduler scheduler)
        {
            _indexer      = indexer;
            _indexEjector = indexEjector;
            _supervisor   = supervisor;
            _searcher     = searcher;
            _scheduler    = scheduler;

            eventReactor.Register(EngineEvent.PathWatchingStarted, a => PathWatchingStarted?.Invoke(a));
            eventReactor.Register(EngineEvent.PathWatchingEnded, a => PathWatchingEnded?.Invoke(a));
            eventReactor.Register(EngineEvent.FileIndexingStarted, a => FileIndexingStarted?.Invoke(a));
            eventReactor.Register(EngineEvent.FileIndexingEnded, a => FileIndexingEnded?.Invoke(a));
            eventReactor.Register(EngineEvent.FileRemovingStarted, a => FileRemovingStarted?.Invoke(a));
            eventReactor.Register(EngineEvent.FileRemovingEnded, a => FileRemovingEnded?.Invoke(a));
            eventReactor.Register(EngineEvent.FileUpdateInitiated, a => FileUpdateInitiated?.Invoke(a));
            eventReactor.Register(EngineEvent.FileUpdateFailed, a => FileUpdateFailed?.Invoke(a));
            eventReactor.Register(EngineEvent.PathChanged, a => FilePathChanged?.Invoke(a));
            eventReactor.Register(EngineEvent.IndexCleanUpFailed, a => IndexCleanUpFailed?.Invoke(a));

            _scheduler.Start();
        }
Example #2
0
        /// <summary>
        /// Creates new search engine instance
        /// </summary>
        /// <param name="settings">Engine settings object</param>
        /// <returns>New search engine instance</returns>
        public static ISearchEngine New(SearchEngineSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            var eventReactor          = new EventReactor();
            var fileParserProvider    = new FileParserProvider(settings);
            var filesVersionsRegistry = new FilesVersionsRegistry();
            var index              = new Index.Index();
            var indexer            = new FileIndexer(eventReactor, fileParserProvider, index, filesVersionsRegistry, settings);
            var indexEjector       = new IndexEjector(eventReactor, filesVersionsRegistry);
            var indexUpdater       = new IndexUpdater(eventReactor, indexer, filesVersionsRegistry);
            var watchersCollection = new PathWatchersCollection();
            var fileSupervisor     = new FileSupervisor(
                eventReactor,
                new FileSystemEventsProcessor(
                    new FileSystemEventHandler(
                        new CreateEventHandler(indexer),
                        new ChangeEventHandler(indexUpdater),
                        new DeleteEventHandler(eventReactor, indexEjector, watchersCollection),
                        new RenameEventHandler(
                            eventReactor,
                            new FilePathActualizer(filesVersionsRegistry),
                            watchersCollection
                            )
                        )
                    ),
                watchersCollection,
                new PathPoller(
                    new DeadPathDetector(
                        watchersCollection,
                        new PathRemover(eventReactor, watchersCollection, indexEjector)
                        ),
                    watchersCollection
                    )
                );
            var searcher     = new Searcher(index);
            var indexCleaner = new IndexCleaner(eventReactor, index, filesVersionsRegistry, settings);
            var scheduler    = new Scheduler(indexCleaner, settings);

            return(new SearchEngine(eventReactor, indexer, indexEjector, fileSupervisor, searcher, scheduler));
        }