public void ConstructorTakesTransmissionManager() { var manager = new TransmissionManager(); var agg = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), manager); Assert.That(agg.TransmissionManager, Is.EqualTo(manager)); }
public void SetUp() { this.session = new Mock <ISession>(); this.queue = new Mock <ISyncEventQueue>(); this.storage = new Mock <IMetaDataStorage>(); this.activityListener = new Mock <IActivityListener>(); this.listener = new ActivityListenerAggregator(this.activityListener.Object, new ActiveActivitiesManager()); this.filters = new Mock <IFilterAggregator>(); }
/// <summary> /// Constructor. /// </summary> public ControllerBase() { this.FoldersPath = ConfigManager.CurrentConfig.GetFoldersPath(); this.transmissionManager = new ActiveActivitiesManager(); this.activityListenerAggregator = new ActivityListenerAggregator(this, this.transmissionManager); this.transmissionManager.ActiveTransmissions.CollectionChanged += delegate(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { this.OnTransmissionListChanged(); }; }
/// <summary> /// Constructor for the general controller. /// </summary> public ControllerBase() { this.FoldersPath = ConfigManager.CurrentConfig.GetFoldersPath(); this.transmissionManager = new TransmissionManager(); this.activityListenerAggregator = new ActivityListenerAggregator(this, this.transmissionManager); this.transmissionManager.ActiveTransmissions.CollectionChanged += delegate(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { this.OnTransmissionListChanged(); }; this.FolderListChanged += delegate { new Thread(() => { lock (brandLock) { if (CheckBrand(firstCheckBrand)) { firstCheckBrand = false; return; } SetupBrand(); } }).Start(); }; this.statusAggregator.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => { switch (this.statusAggregator.Status) { case SyncStatus.Idle: this.OnIdle(); break; case SyncStatus.Synchronizing: this.OnSyncing(); break; case SyncStatus.Warning: this.OnError(); break; case SyncStatus.Disconnected: this.OnDisconnected(); break; case SyncStatus.Suspend: this.OnPaused(); break; case SyncStatus.Deactivated: this.OnDeactivated(); break; default: this.OnIdle(); break; } }; }
/// <summary> /// Initializes a new instance of the <see cref="SyncMechanism"/> class. /// </summary> /// <param name="localSituation">Local situation.</param> /// <param name="remoteSituation">Remote situation.</param> /// <param name="queue">Sync event queue.</param> /// <param name="session">CMIS Session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="transmissionStorage">File transmission storage.</param> /// <param name="activityListener">Active sync progress listener.</param> /// <param name="filters">Ignore filter.</param> /// <param name="solver">Solver for custom solver matrix.</param> public SyncMechanism( ISituationDetection <AbstractFolderEvent> localSituation, ISituationDetection <AbstractFolderEvent> remoteSituation, ISyncEventQueue queue, ISession session, IMetaDataStorage storage, IFileTransmissionStorage transmissionStorage, ActivityListenerAggregator activityListener, IFilterAggregator filters, ISolver[,] solver = null) : base(queue) { if (session == null) { throw new ArgumentNullException("session"); } if (storage == null) { throw new ArgumentNullException("storage"); } if (transmissionStorage == null) { throw new ArgumentNullException("transmissionStorage"); } if (localSituation == null) { throw new ArgumentNullException("localSituation"); } if (remoteSituation == null) { throw new ArgumentNullException("remoteSituation"); } if (activityListener == null) { throw new ArgumentNullException("activityListener"); } if (filters == null) { throw new ArgumentNullException("filters"); } this.session = session; this.storage = storage; this.transmissionStorage = transmissionStorage; this.LocalSituation = localSituation; this.RemoteSituation = remoteSituation; this.activityListener = activityListener; this.filters = filters; this.Solver = solver == null?this.CreateSolver() : solver; }
public void Init() { this.subfolder = SubfolderBase + Guid.NewGuid().ToString(); Console.WriteLine("Working on " + this.subfolder); // RepoInfo this.repoInfo = new RepoInfo { AuthenticationType = AuthenticationType.BASIC, LocalPath = Path.Combine(config[1].ToString(), this.subfolder), RemotePath = config[2].ToString() + "/" + this.subfolder, Address = new XmlUri(new Uri(config[3].ToString())), User = config[4].ToString(), RepositoryId = config[6].ToString() }; this.repoInfo.RemotePath = this.repoInfo.RemotePath.Replace("//", "/"); this.repoInfo.SetPassword(config[5].ToString()); // FileSystemDir this.localRootDir = new DirectoryInfo(this.repoInfo.LocalPath); this.localRootDir.Create(); // Repo var activityListener = new Mock <IActivityListener>(); var transmissionManager = new ActiveActivitiesManager(); var activityAggregator = new ActivityListenerAggregator(activityListener.Object, transmissionManager); var queue = new SingleStepEventQueue(new SyncEventManager()); this.repo = new CmisRepoMock(this.repoInfo, activityAggregator, queue); // Session var cmisParameters = new Dictionary <string, string>(); cmisParameters[SessionParameter.BindingType] = BindingType.AtomPub; cmisParameters[SessionParameter.AtomPubUrl] = this.repoInfo.Address.ToString(); cmisParameters[SessionParameter.User] = this.repoInfo.User; cmisParameters[SessionParameter.Password] = this.repoInfo.GetPassword().ToString(); cmisParameters[SessionParameter.RepositoryId] = this.repoInfo.RepositoryId; SessionFactory factory = SessionFactory.NewInstance(); this.session = factory.CreateSession(cmisParameters); IFolder root = (IFolder)this.session.GetObjectByPath(config[2].ToString()); foreach (var child in root.GetChildren()) { if (child is IFolder && child.Name == this.subfolder) { (child as IFolder).DeleteTree(true, null, true); } } root.Refresh(); this.remoteRootDir = root.CreateFolder(this.subfolder); }
public void SetUp() { this.session = new Mock <ISession>(); this.session.SetupTypeSystem(); this.queue = new Mock <ISyncEventQueue>(); this.storage = new Mock <IMetaDataStorage>(); this.fileTransmissionStorage = new Mock <IFileTransmissionStorage>(); this.activityListener = new Mock <IActivityListener>(); this.listener = new ActivityListenerAggregator(this.activityListener.Object, new TransmissionManager()); this.filters = new Mock <IFilterAggregator>(); }
/// <summary> /// Initializes a new instance of the <see cref="SyncMechanism"/> class. /// </summary> /// <param name="localSituation">Local situation.</param> /// <param name="remoteSituation">Remote situation.</param> /// <param name="queue">Sync event queue.</param> /// <param name="session">CMIS Session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="activityListener">Active sync progress listener.</param> /// <param name="solver">Solver for custom solver matrix.</param> /// <param name="isServerAbleToUpdateModificationDate">Enables the modification date sync feature.</param> public SyncMechanism( ISituationDetection <AbstractFolderEvent> localSituation, ISituationDetection <AbstractFolderEvent> remoteSituation, ISyncEventQueue queue, ISession session, IMetaDataStorage storage, ActivityListenerAggregator activityListener, IFilterAggregator filters, ISolver[,] solver = null, bool isServerAbleToUpdateModificationDate = false) : base(queue) { if (session == null) { throw new ArgumentNullException("Given session is null"); } if (storage == null) { throw new ArgumentNullException("Given storage is null"); } if (localSituation == null) { throw new ArgumentNullException("Given local situation detection is null"); } if (remoteSituation == null) { throw new ArgumentNullException("Given remote situation detection is null"); } if (activityListener == null) { throw new ArgumentNullException("Given activity listener is null"); } if (filters == null) { throw new ArgumentNullException("Given filter aggregator is null"); } this.session = session; this.storage = storage; this.LocalSituation = localSituation; this.RemoteSituation = remoteSituation; this.activityListener = activityListener; this.isServerAbleToUpdateModificationDate = isServerAbleToUpdateModificationDate; this.filters = filters; this.Solver = solver == null?this.CreateSolver() : solver; }
/// <summary> /// Initializes a new instance of the <see cref="SyncMechanism"/> class. /// </summary> /// <param name="localSituation">Local situation.</param> /// <param name="remoteSituation">Remote situation.</param> /// <param name="queue">Sync event queue.</param> /// <param name="session">CMIS Session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="transmissionStorage">File transmission storage.</param> /// <param name="activityListener">Active sync progress listener.</param> /// <param name="filters">Ignore filter.</param> /// <param name="solver">Solver for custom solver matrix.</param> public SyncMechanism( ISituationDetection<AbstractFolderEvent> localSituation, ISituationDetection<AbstractFolderEvent> remoteSituation, ISyncEventQueue queue, ISession session, IMetaDataStorage storage, IFileTransmissionStorage transmissionStorage, ActivityListenerAggregator activityListener, IFilterAggregator filters, ISolver[,] solver = null) : base(queue) { if (session == null) { throw new ArgumentNullException("session"); } if (storage == null) { throw new ArgumentNullException("storage"); } if (transmissionStorage == null) { throw new ArgumentNullException("transmissionStorage"); } if (localSituation == null) { throw new ArgumentNullException("localSituation"); } if (remoteSituation == null) { throw new ArgumentNullException("remoteSituation"); } if (activityListener == null) { throw new ArgumentNullException("activityListener"); } if (filters == null) { throw new ArgumentNullException("filters"); } this.session = session; this.storage = storage; this.transmissionStorage = transmissionStorage; this.LocalSituation = localSituation; this.RemoteSituation = remoteSituation; this.activityListener = activityListener; this.filters = filters; this.Solver = solver == null ? this.CreateSolver() : solver; }
private void SetupMocks() { this.listener = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), new TransmissionManager()); var subfolder = Guid.NewGuid().ToString(); this.queue = new SingleStepEventQueue(new SyncEventManager()); this.queue.SwallowExceptions = true; this.repoInfo = new RepoInfo { AuthenticationType = AuthenticationType.BASIC, LocalPath = Path.Combine(config[1].ToString(), subfolder), RemotePath = config[2].ToString() + "/" + subfolder, Address = new XmlUri(new Uri(config[3].ToString())), User = config[4].ToString(), RepositoryId = config[6].ToString() }; // FileSystemDir this.localPath = new DirectoryInfo(this.repoInfo.LocalPath); this.localPath.Create(); if (!new DirectoryInfoWrapper(this.localPath).IsExtendedAttributeAvailable()) { Assert.Fail(string.Format("The local path {0} does not support extended attributes", this.localPath.FullName)); } }
public InMemoryRepo(RepoInfo repoInfo, ActivityListenerAggregator listener) : base(repoInfo, listener, true, CmisSync.Lib.Cmis.Repository.CreateQueue()) { }
public void RepositoryDetectsDisconnectionAndReconnects() { var repoInfo = new RepoInfo(); var listener = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), new TransmissionManager()); var underTest = new InMemoryRepo(repoInfo, listener); }
/// <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); }
public CmisRepoMock(RepoInfo repoInfo, ActivityListenerAggregator activityListener, SingleStepEventQueue queue) : base(repoInfo, activityListener, true, queue) { this.SingleStepQueue = queue; }
public void Init() { string testName = this.GetType().Name; object[] attributes = this.GetType().GetCustomAttributes(true); foreach (var attr in attributes) { if (attr is TestNameAttribute) { testName = (attr as TestNameAttribute).Name; } } this.subfolder = testName + "_" + Guid.NewGuid().ToString(); Console.WriteLine("Working on " + this.subfolder); // RepoInfo this.repoInfo = new RepoInfo { AuthenticationType = AuthenticationType.BASIC, LocalPath = Path.Combine(config[1].ToString(), this.subfolder), RemotePath = config[2].ToString() + "/" + this.subfolder, Address = new XmlUri(new Uri(config[3].ToString())), User = config[4].ToString(), RepositoryId = config[6].ToString(), Binding = config[7] != null ? config[7].ToString() : BindingType.AtomPub }; this.repoInfo.RemotePath = this.repoInfo.RemotePath.Replace("//", "/"); this.repoInfo.SetPassword(config[5].ToString()); // FileSystemDir this.localRootDir = new DirectoryInfo(this.repoInfo.LocalPath); this.localRootDir.Create(); if (!new DirectoryInfoWrapper(this.localRootDir).IsExtendedAttributeAvailable()) { Assert.Fail(string.Format("The local path {0} does not support extended attributes", this.localRootDir.FullName)); } // Repo var activityListener = new Mock <IActivityListener>(); this.transmissionManager = new TransmissionManager(); var activityAggregator = new ActivityListenerAggregator(activityListener.Object, this.transmissionManager); var queue = new SingleStepEventQueue(new SyncEventManager()); this.repo = new FullRepoTests.CmisRepoMock(this.repoInfo, activityAggregator, queue); // Session var cmisParameters = new Dictionary <string, string>(); cmisParameters[SessionParameter.BindingType] = repoInfo.Binding; switch (repoInfo.Binding) { case BindingType.AtomPub: cmisParameters[SessionParameter.AtomPubUrl] = this.repoInfo.Address.ToString(); break; case BindingType.Browser: cmisParameters[SessionParameter.BrowserUrl] = this.repoInfo.Address.ToString(); break; default: Assert.Fail(string.Format("Unknown binding type {0}", repoInfo.Binding)); break; } cmisParameters[SessionParameter.User] = this.repoInfo.User; cmisParameters[SessionParameter.Password] = this.repoInfo.GetPassword().ToString(); cmisParameters[SessionParameter.RepositoryId] = this.repoInfo.RepositoryId; cmisParameters[SessionParameter.UserAgent] = Utils.CreateUserAgent(); SessionFactory factory = SessionFactory.NewInstance(); this.session = factory.CreateSession(cmisParameters); this.ContentChangesActive = this.session.AreChangeEventsSupported(); IFolder root = (IFolder)this.session.GetObjectByPath(config[2].ToString()); this.remoteRootDir = root.CreateFolder(this.subfolder); }
public void SetUp() { this.queue = new Mock <ISyncEventQueue>(); this.listener = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), new ActiveActivitiesManager()); }
private void RunSuccessfulLoginEvent(IMetaDataStorage storage, ISyncEventManager manager, ActivityListenerAggregator listener, bool changeEventSupported = false, string id = "i", string token = "t") { var e = CreateNewSessionEvent(changeEventSupported, id, token); var handler = this.CreateStrategyInitializer(storage, manager, listener); Assert.True(handler.Handle(e)); }
private EventManagerInitializer CreateStrategyInitializer(IMetaDataStorage storage, ISyncEventManager manager, ActivityListenerAggregator listener) { this.queue.Setup(s => s.EventManager).Returns(manager); return(new EventManagerInitializer(this.queue.Object, storage, CreateRepoInfo(), MockOfIFilterAggregatorUtil.CreateFilterAggregator().Object, listener)); }
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> public Repository(RepoInfo repoInfo, ActivityListenerAggregator activityListener) : this(repoInfo, activityListener, false, CreateQueue()) { }
public TestRepository( RepoInfo repoInfo, ActivityListenerAggregator activityListener, SingleStepEventQueue queue) : base(repoInfo, activityListener, true, 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, 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); }