/// <summary> /// Initializes a new instance of the <see cref="Repository"/> class. /// </summary> /// <param name="repoInfo">Repo info.</param> /// <param name="activityListener">Activity listener.</param> /// <param name="inMemory">If set to <c>true</c> in memory.</param> /// <param name="queue">Event Queue.</param> protected Repository(RepoInfo repoInfo, ActivityListenerAggregator activityListener, bool inMemory, ICountingQueue queue) : base(repoInfo) { if (activityListener == null) { throw new ArgumentNullException("activityListener"); } this.fileSystemFactory = new FileSystemInfoFactory(); this.activityListener = activityListener; this.rootFolderMonitor = new RepositoryRootDeletedDetection(this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath)); this.rootFolderMonitor.RepoRootDeleted += this.RootFolderAvailablilityChanged; if (!this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath).IsExtendedAttributeAvailable()) { throw new ExtendedAttributeException("Extended Attributes are not available on the local path: " + this.LocalPath); } this.Queue = queue; this.Queue.EventManager.AddEventHandler(rootFolderMonitor); this.Queue.EventManager.AddEventHandler(new DebugLoggingHandler()); // Create Database connection this.db = new DBreezeEngine(new DBreezeConfiguration { DBreezeDataFolderName = inMemory ? string.Empty : repoInfo.GetDatabasePath(), Storage = inMemory ? DBreezeConfiguration.eStorage.MEMORY : DBreezeConfiguration.eStorage.DISK }); // Create session dependencies this.sessionFactory = SessionFactory.NewInstance(); this.authProvider = AuthProviderFactory.CreateAuthProvider(repoInfo.AuthenticationType, repoInfo.Address, this.db); // Initialize storage this.storage = new MetaDataStorage(this.db, new PathMatcher(this.LocalPath, this.RepoInfo.RemotePath), inMemory); this.fileTransmissionStorage = new FileTransmissionStorage(this.db, RepoInfo.ChunkSize); // Add ignore file/folder filter this.ignoredFoldersFilter = new IgnoredFoldersFilter { IgnoredPaths = new List <string>(repoInfo.GetIgnoredPaths()) }; this.ignoredFileNameFilter = new IgnoredFileNamesFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFileNames }; this.ignoredFolderNameFilter = new IgnoredFolderNameFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFolderNames }; this.invalidFolderNameFilter = new InvalidFolderNameFilter(); var symlinkFilter = new SymlinkFilter(); this.filters = new FilterAggregator(this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, this.ignoredFoldersFilter, symlinkFilter); this.reportingFilter = new ReportingFilter( this.Queue, this.ignoredFoldersFilter, this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, symlinkFilter); this.Queue.EventManager.AddEventHandler(this.reportingFilter); this.alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.alreadyAddedFilter); // Add handler for repo config changes this.Queue.EventManager.AddEventHandler(new GenericSyncEventHandler <RepoConfigChangedEvent>(0, this.RepoInfoChanged)); // Add periodic sync procedures scheduler this.Scheduler = new SyncScheduler(this.Queue, repoInfo.PollInterval); this.Queue.EventManager.AddEventHandler(this.Scheduler); // Add File System Watcher #if __COCOA__ this.WatcherProducer = new CmisSync.Lib.Producer.Watcher.MacWatcher(LocalPath, Queue); #else this.WatcherProducer = new NetWatcher(new FileSystemWatcher(this.LocalPath), this.Queue, this.storage); #endif this.WatcherConsumer = new WatcherConsumer(this.Queue); this.Queue.EventManager.AddEventHandler(this.WatcherConsumer); // Add transformer this.transformer = new ContentChangeEventTransformer(this.Queue, this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.transformer); // Add local fetcher var localFetcher = new LocalObjectFetcher(this.storage.Matcher, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(localFetcher); this.ignoredStorage = new IgnoredEntitiesStorage(new IgnoredEntitiesCollection(), this.storage); this.Queue.EventManager.AddEventHandler(new EventManagerInitializer(this.Queue, this.storage, this.fileTransmissionStorage, this.ignoredStorage, this.RepoInfo, this.filters, activityListener, this.fileSystemFactory)); this.Queue.EventManager.AddEventHandler(new DelayRetryAndNextSyncEventHandler(this.Queue)); this.connectionScheduler = new ConnectionScheduler(this.RepoInfo, this.Queue, this.sessionFactory, this.authProvider); this.Queue.EventManager.AddEventHandler(this.connectionScheduler); this.Queue.EventManager.AddEventHandler( new GenericSyncEventHandler <SuccessfulLoginEvent>( 10000, delegate(ISyncEvent e) { this.RepoStatusFlags.Connected = true; this.Status = this.RepoStatusFlags.Status; return(false); })); this.Queue.EventManager.AddEventHandler( new GenericSyncEventHandler <ConfigurationNeededEvent>( 10000, delegate(ISyncEvent e) { this.RepoStatusFlags.Warning = true; this.Status = this.RepoStatusFlags.Status; return(false); })); this.unsubscriber = this.Queue.CategoryCounter.Subscribe(this); }
private SingleStepEventQueue CreateQueue(Mock <ISession> session, IMetaDataStorage storage, ObservableHandler observer, IFileSystemInfoFactory fsFactory = null) { var manager = new SyncEventManager(); SingleStepEventQueue queue = new SingleStepEventQueue(manager); manager.AddEventHandler(observer); var connectionScheduler = new ConnectionScheduler(new RepoInfo(), queue, Mock.Of <ISessionFactory>(), Mock.Of <IAuthenticationProvider>()); manager.AddEventHandler(connectionScheduler); var changes = new ContentChanges(session.Object, storage, queue, this.maxNumberOfContentChanges, this.isPropertyChangesSupported); manager.AddEventHandler(changes); var transformer = new ContentChangeEventTransformer(queue, storage, fsFactory); manager.AddEventHandler(transformer); var ccaccumulator = new ContentChangeEventAccumulator(session.Object, queue); manager.AddEventHandler(ccaccumulator); var remoteFetcher = new RemoteObjectFetcher(session.Object, storage); manager.AddEventHandler(remoteFetcher); var localFetcher = new LocalObjectFetcher(storage.Matcher, fsFactory); manager.AddEventHandler(localFetcher); var watcher = new Strategy.WatcherConsumer(queue); manager.AddEventHandler(watcher); var localDetection = new LocalSituationDetection(); var remoteDetection = new RemoteSituationDetection(); var transmissionManager = new ActiveActivitiesManager(); var activityAggregator = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), transmissionManager); var ignoreFolderFilter = new IgnoredFoldersFilter(); var ignoreFolderNameFilter = new IgnoredFolderNameFilter(); var ignoreFileNamesFilter = new IgnoredFileNamesFilter(); var invalidFolderNameFilter = new InvalidFolderNameFilter(); var filterAggregator = new FilterAggregator(ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter, ignoreFolderFilter); var syncMechanism = new SyncMechanism(localDetection, remoteDetection, queue, session.Object, storage, activityAggregator, filterAggregator, isServerAbleToUpdateModificationDate: true); manager.AddEventHandler(syncMechanism); var remoteFolder = MockSessionUtil.CreateCmisFolder(); var localFolder = new Mock <IDirectoryInfo>(); var generator = new CrawlEventGenerator(storage, fsFactory); var treeBuilder = new DescendantsTreeBuilder(storage, remoteFolder.Object, localFolder.Object, filterAggregator); var notifier = new CrawlEventNotifier(queue); var crawler = new DescendantsCrawler(queue, treeBuilder, generator, notifier, Mock.Of <IActivityListener>()); manager.AddEventHandler(crawler); var permissionDenied = new GenericHandleDublicatedEventsFilter <PermissionDeniedEvent, ConfigChangedEvent>(); manager.AddEventHandler(permissionDenied); var alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(storage, fsFactory); manager.AddEventHandler(alreadyAddedFilter); var ignoreContentChangesFilter = new IgnoreAlreadyHandledContentChangeEventsFilter(storage, session.Object); manager.AddEventHandler(ignoreContentChangesFilter); var delayRetryAndNextSyncEventHandler = new DelayRetryAndNextSyncEventHandler(queue); manager.AddEventHandler(delayRetryAndNextSyncEventHandler); /* This is not implemented yet * var failedOperationsFilder = new FailedOperationsFilter(queue); * manager.AddEventHandler(failedOperationsFilder); */ var reportingFilter = new ReportingFilter(queue, ignoreFolderFilter, ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter); manager.AddEventHandler(reportingFilter); var debugHandler = new DebugLoggingHandler(); manager.AddEventHandler(debugHandler); var movedOrRenamed = new RemoteObjectMovedOrRenamedAccumulator(queue, storage, fsFactory); manager.AddEventHandler(movedOrRenamed); return(queue); }
/// <summary> /// Initializes a new instance of the <see cref="Repository"/> class. /// </summary> /// <param name="repoInfo">Repo info.</param> /// <param name="activityListener">Activity listener.</param> /// <param name="inMemory">If set to <c>true</c> in memory.</param> /// <param name="queue">Event Queue.</param> protected Repository(RepoInfo repoInfo, ActivityListenerAggregator activityListener, bool inMemory, IDisposableSyncEventQueue queue) { if (repoInfo == null) { throw new ArgumentNullException("Given repoInfo is null"); } if (activityListener == null) { throw new ArgumentNullException("Given activityListener is null"); } this.fileSystemFactory = new FileSystemInfoFactory(); // Initialize local variables this.RepoInfo = repoInfo; this.LocalPath = repoInfo.LocalPath; this.Name = repoInfo.DisplayName; this.RemoteUrl = repoInfo.Address; if (!this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath).IsExtendedAttributeAvailable()) { throw new ExtendedAttributeException("Extended Attributes are not available on the local path: " + this.LocalPath); } this.Queue = queue; this.Queue.EventManager.AddEventHandler(new DebugLoggingHandler()); // Create Database connection this.db = new DBreezeEngine(new DBreezeConfiguration { DBreezeDataFolderName = inMemory ? string.Empty : repoInfo.GetDatabasePath(), Storage = inMemory ? DBreezeConfiguration.eStorage.MEMORY : DBreezeConfiguration.eStorage.DISK }); // Create session dependencies this.sessionFactory = SessionFactory.NewInstance(); this.authProvider = AuthProviderFactory.CreateAuthProvider(repoInfo.AuthenticationType, repoInfo.Address, this.db); // Initialize storage this.storage = new MetaDataStorage(this.db, new PathMatcher(this.LocalPath, this.RepoInfo.RemotePath)); // Add ignore file/folder filter this.ignoredFoldersFilter = new IgnoredFoldersFilter { IgnoredPaths = new List <string>(repoInfo.GetIgnoredPaths()) }; this.ignoredFileNameFilter = new IgnoredFileNamesFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFileNames }; this.ignoredFolderNameFilter = new IgnoredFolderNameFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFolderNames }; this.invalidFolderNameFilter = new InvalidFolderNameFilter(); this.filters = new FilterAggregator(this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, this.ignoredFoldersFilter); this.reportingFilter = new ReportingFilter( this.Queue, this.ignoredFoldersFilter, this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter); this.Queue.EventManager.AddEventHandler(this.reportingFilter); this.alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.alreadyAddedFilter); // Add handler for repo config changes this.Queue.EventManager.AddEventHandler(new GenericSyncEventHandler <RepoConfigChangedEvent>(0, this.RepoInfoChanged)); // Add periodic sync procedures scheduler this.Scheduler = new SyncScheduler(this.Queue, repoInfo.PollInterval); this.Queue.EventManager.AddEventHandler(this.Scheduler); // Add File System Watcher #if __COCOA__ this.WatcherProducer = new CmisSync.Lib.Producer.Watcher.MacWatcher(LocalPath, Queue); #else this.WatcherProducer = new NetWatcher(new FileSystemWatcher(this.LocalPath), this.Queue, this.storage); #endif this.WatcherConsumer = new WatcherConsumer(this.Queue); this.Queue.EventManager.AddEventHandler(this.WatcherConsumer); // Add transformer this.transformer = new ContentChangeEventTransformer(this.Queue, this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.transformer); // Add local fetcher var localFetcher = new LocalObjectFetcher(this.storage.Matcher, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(localFetcher); this.SyncStatusChanged += delegate(SyncStatus status) { this.Status = status; }; this.Queue.EventManager.AddEventHandler(new EventManagerInitializer(this.Queue, this.storage, this.RepoInfo, this.filters, activityListener, this.fileSystemFactory)); this.Queue.EventManager.AddEventHandler(new DelayRetryAndNextSyncEventHandler(this.Queue)); this.connectionScheduler = new ConnectionScheduler(this.RepoInfo, this.Queue, this.sessionFactory, this.authProvider); this.Queue.EventManager.AddEventHandler(this.connectionScheduler); }