private IOutlookSynchronizer CreateTaskSynchronizer(Options options, AvailableSynchronizerComponents componentsToFill) { var mappingParameters = GetMappingParameters <TaskMappingConfiguration> (options); var atypeRepository = new OutlookTaskRepository(_outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, _daslFilterProvider); var calDavDataAccess = new CalDavDataAccess( new Uri(options.CalenderUrl), CreateWebDavClient( options.UserName, options.GetEffectivePassword(_outlookAccountPasswordProvider), options.CalenderUrl, _calDavConnectTimeout, options.ServerAdapterType, options.CloseAfterEachRequest, options.PreemptiveAuthentication, options.ForceBasicAuthentication, options.ProxyOptions)); componentsToFill.CalDavDataAccess = calDavDataAccess; var btypeRepository = new CalDavRepository( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Todo, NullDateTimeRangeProvider.Instance, false); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> ( new TaskMapper(_outlookSession.Application.TimeZones.CurrentTimeZone.ID, mappingParameters), atypeRepository, btypeRepository, outlookEventRelationDataFactory, ExceptionHandler.Instance); var storageDataDirectory = _profileDataDirectoryFactory(options.Id); var btypeIdEqualityComparer = WebResourceName.Comparer; var atypeIdEqualityComparer = EqualityComparer <string> .Default; var synchronizer = new Synchronizer <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> ( atypeRepository, btypeRepository, InitialTaskSyncStateCreationStrategyFactory.Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution), new EntityRelationDataAccess <string, DateTime, OutlookEventRelationData, WebResourceName, string> (storageDataDirectory), outlookEventRelationDataFactory, new InitialTaskEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance); return(new OutlookSynchronizer <WebResourceName, string> (synchronizer)); }
/// <remarks> /// Public because it is being used by integration tests /// </remarks> public ISynchronizer CreateEventSynchronizer( Options options, ICalDavDataAccess calDavDataAccess, IEntityRelationDataAccess <string, DateTime, Uri, string> entityRelationDataAccess) { var dateTimeRangeProvider = options.IgnoreSynchronizationTimeRange ? NullDateTimeRangeProvider.Instance : new DateTimeRangeProvider(options.DaysToSynchronizeInThePast, options.DaysToSynchronizeInTheFuture); var atypeRepository = new OutlookEventRepository( _outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, dateTimeRangeProvider); IEntityRepository <IICalendar, Uri, string> btypeRepository = new CalDavRepository( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Event, dateTimeRangeProvider); var entityMapper = new EventEntityMapper( _outlookEmailAddress, new Uri("mailto:" + options.EmailAddress), _outlookSession.Application.TimeZones.CurrentTimeZone.ID, _outlookSession.Application.Version); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <string, DateTime, AppointmentItemWrapper, Uri, string, IICalendar> ( entityMapper, atypeRepository, btypeRepository, outlookEventRelationDataFactory, ExceptionHandler.Instance ); var btypeIdEqualityComparer = EqualityComparer <Uri> .Default; var atypeIdEqualityComparer = EqualityComparer <string> .Default; return(new Synchronizer <string, DateTime, AppointmentItemWrapper, Uri, string, IICalendar> ( atypeRepository, btypeRepository, InitialEventSyncStateCreationStrategyFactory.Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution), entityRelationDataAccess, outlookEventRelationDataFactory, new InitialEventEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance)); }
private OutlookSynchronizer CreateTaskSynchronizer(Options options) { // TODO: dispose folder like it is done for events var calendarFolder = (Folder)_outlookSession.GetFolderFromID(options.OutlookFolderEntryId, options.OutlookFolderStoreId); var atypeRepository = new OutlookTaskRepository(calendarFolder, _outlookSession); var btypeRepository = new CalDavRepository( new CalDavDataAccess( new Uri(options.CalenderUrl), CreateWebDavClient( options.UserName, options.Password, _calDavConnectTimeout, options.ServerAdapterType, options.CloseAfterEachRequest, options.ProxyOptions)), new iCalendarSerializer(), CalDavRepository.EntityType.Todo, NullDateTimeRangeProvider.Instance); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <string, DateTime, TaskItemWrapper, Uri, string, IICalendar> ( new TaskMapper(_outlookSession.Application.TimeZones.CurrentTimeZone.ID), atypeRepository, btypeRepository, outlookEventRelationDataFactory, ExceptionHandler.Instance); var storageDataDirectory = _profileDataDirectoryFactory(options.Id); var btypeIdEqualityComparer = EqualityComparer <Uri> .Default; var atypeIdEqualityComparer = EqualityComparer <string> .Default; var synchronizer = new Synchronizer <string, DateTime, TaskItemWrapper, Uri, string, IICalendar> ( atypeRepository, btypeRepository, InitialTaskSyncStateCreationStrategyFactory.Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution), new EntityRelationDataAccess <string, DateTime, OutlookEventRelationData, Uri, string> (storageDataDirectory), outlookEventRelationDataFactory, new InitialTaskEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance); return(new OutlookSynchronizer(synchronizer, atypeRepository)); }
public TaskSynchronizationContext(NameSpace outlookSession, IEntityRelationDataAccess <string, DateTime, Uri, string> storageDataAccess, Options options, TimeSpan connectTimeout, TimeSpan readWriteTimeout, bool disableCertValidation, bool useSsl3, bool useTls12, IEqualityComparer <Uri> btypeIdEqualityComparer) { if (outlookSession == null) { throw new ArgumentNullException("outlookSession"); } SynchronizationMode = options.SynchronizationMode; From = DateTime.Now.AddDays(-options.DaysToSynchronizeInThePast); To = DateTime.Now.AddDays(options.DaysToSynchronizeInTheFuture); _entityRelationDataFactory = new OutlookEventRelationDataFactory(); _entityMapper = new TaskMapper(outlookSession.Application.TimeZones.CurrentTimeZone.ID); var calendarFolder = (Folder)outlookSession.GetFolderFromID(options.OutlookFolderEntryId, options.OutlookFolderStoreId); _atypeRepository = new OutlookTaskRepository(calendarFolder, outlookSession); _btypeRepository = new CalDavRepository( new CalDavDataAccess( new Uri(options.CalenderUrl), new CalDavWebClient( options.UserName, options.Password, connectTimeout, readWriteTimeout, disableCertValidation, useSsl3, useTls12) ), new iCalendarSerializer(), CalDavRepository.EntityType.Todo); _storageDataAccess = storageDataAccess; InitialEntityMatcher = new InitialTaskEntityMatcher(btypeIdEqualityComparer); }
private static void TestCalDavDataAccess() { var eventRepository = new CalDavRepository(s_dataAccess, new DDay.iCal.Serialization.iCalendar.iCalendarSerializer(), CalDavRepository.EntityType.Event); var versions = eventRepository.GetVersions(DateTime.Now.AddDays(-1000), DateTime.Now.AddDays(1000)); //var events = eventRepository.Get (versions.Keys); //foreach (var e in s_dataAccess.GetEvents (null, null)) // s_dataAccess.DeleteEvent (e); //var evt = eventRepository.Create (e => //{ // e.Summary = "bla"; // e.Location = "iwo"; // e.Start = new iCalDateTime (DateTime.UtcNow.AddHours (-4)); // e.DTEnd = new iCalDateTime (DateTime.UtcNow.AddHours (-3)); // return e; //}); //foreach (var evt in x) //{ // Console.WriteLine ("Value:{0}, {1} ",evt.Summary, evt.Priority); //} //eventRepository.Update (evt.Id, e => //{ // e.Summary = "blubb"; // e.Location = "iwo"; // e.Start = new iCalDateTime (DateTime.UtcNow.AddHours (-4)); // e.DTEnd = new iCalDateTime (DateTime.UtcNow.AddHours (-3)); // return e; //}); }
/// <remarks> /// Public because it is being used by integration tests /// </remarks> public IOutlookSynchronizer CreateEventSynchronizer( Options options, ICalDavDataAccess calDavDataAccess, IEntityRelationDataAccess <string, DateTime, WebResourceName, string> entityRelationDataAccess) { var dateTimeRangeProvider = options.IgnoreSynchronizationTimeRange ? NullDateTimeRangeProvider.Instance : new DateTimeRangeProvider(options.DaysToSynchronizeInThePast, options.DaysToSynchronizeInTheFuture); var mappingParameters = GetMappingParameters <EventMappingConfiguration> (options); var atypeRepository = new OutlookEventRepository( _outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, dateTimeRangeProvider, mappingParameters, _daslFilterProvider); IEntityRepository <IICalendar, WebResourceName, string, int> btypeRepository = new CalDavRepository( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Event, dateTimeRangeProvider, options.ServerAdapterType == ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth); var entityMapper = new EventEntityMapper( _outlookEmailAddress, new Uri("mailto:" + options.EmailAddress), _outlookSession.Application.TimeZones.CurrentTimeZone.ID, _outlookSession.Application.Version, mappingParameters); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <string, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar> ( entityMapper, outlookEventRelationDataFactory, ExceptionHandler.Instance ); var btypeIdEqualityComparer = WebResourceName.Comparer; var atypeIdEqualityComparer = EqualityComparer <string> .Default; var aTypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository); var bTypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository); var synchronizer = new Synchronizer <string, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar, int> ( atypeRepository, btypeRepository, aTypeWriteRepository, bTypeWriteRepository, InitialSyncStateCreationStrategyFactory <string, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar> .Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution, e => new EventConflictInitialSyncStateCreationStrategyAutomatic(e)), entityRelationDataAccess, outlookEventRelationDataFactory, new InitialEventEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance, NullSynchronizationContextFactory.Instance, EqualityComparer <DateTime> .Default, EqualityComparer <string> .Default); return(new OutlookSynchronizer <WebResourceName, string> (synchronizer)); }
private static void TestCalDavDataAccess() { var eventRepository = new CalDavRepository (s_dataAccess, new DDay.iCal.Serialization.iCalendar.iCalendarSerializer(), CalDavRepository.EntityType.Event); var versions = eventRepository.GetVersions (DateTime.Now.AddDays (-1000), DateTime.Now.AddDays (1000)); //var events = eventRepository.Get (versions.Keys); //foreach (var e in s_dataAccess.GetEvents (null, null)) // s_dataAccess.DeleteEvent (e); //var evt = eventRepository.Create (e => //{ // e.Summary = "bla"; // e.Location = "iwo"; // e.Start = new iCalDateTime (DateTime.UtcNow.AddHours (-4)); // e.DTEnd = new iCalDateTime (DateTime.UtcNow.AddHours (-3)); // return e; //}); //foreach (var evt in x) //{ // Console.WriteLine ("Value:{0}, {1} ",evt.Summary, evt.Priority); //} //eventRepository.Update (evt.Id, e => //{ // e.Summary = "blubb"; // e.Location = "iwo"; // e.Start = new iCalDateTime (DateTime.UtcNow.AddHours (-4)); // e.DTEnd = new iCalDateTime (DateTime.UtcNow.AddHours (-3)); // return e; //}); }
private OutlookSynchronizer CreateTaskSynchronizer (Options options) { // TODO: dispose folder like it is done for events var calendarFolder = (Folder) _outlookSession.GetFolderFromID (options.OutlookFolderEntryId, options.OutlookFolderStoreId); var atypeRepository = new OutlookTaskRepository (calendarFolder, _outlookSession); var btypeRepository = new CalDavRepository ( new CalDavDataAccess ( new Uri (options.CalenderUrl), CreateWebDavClient ( options.UserName, options.Password, _calDavConnectTimeout, options.ServerAdapterType, options.CloseAfterEachRequest, options.ProxyOptions)), new iCalendarSerializer(), CalDavRepository.EntityType.Todo, NullDateTimeRangeProvider.Instance); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory<string, DateTime, TaskItemWrapper, Uri, string, IICalendar> ( new TaskMapper (_outlookSession.Application.TimeZones.CurrentTimeZone.ID), atypeRepository, btypeRepository, outlookEventRelationDataFactory, ExceptionHandler.Instance); var storageDataDirectory = _profileDataDirectoryFactory (options.Id); var btypeIdEqualityComparer = EqualityComparer<Uri>.Default; var atypeIdEqualityComparer = EqualityComparer<string>.Default; var synchronizer = new Synchronizer<string, DateTime, TaskItemWrapper, Uri, string, IICalendar> ( atypeRepository, btypeRepository, InitialTaskSyncStateCreationStrategyFactory.Create ( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution), new EntityRelationDataAccess<string, DateTime, OutlookEventRelationData, Uri, string> (storageDataDirectory), outlookEventRelationDataFactory, new InitialTaskEntityMatcher (btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance); return new OutlookSynchronizer (synchronizer, atypeRepository); }
/// <remarks> /// Public because it is being used by integration tests /// </remarks> public OutlookSynchronizer CreateEventSynchronizer ( Options options, ICalDavDataAccess calDavDataAccess, IEntityRelationDataAccess<string, DateTime, Uri, string> entityRelationDataAccess) { var dateTimeRangeProvider = options.IgnoreSynchronizationTimeRange ? NullDateTimeRangeProvider.Instance : new DateTimeRangeProvider (options.DaysToSynchronizeInThePast, options.DaysToSynchronizeInTheFuture); var atypeRepository = new OutlookEventRepository ( _outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, dateTimeRangeProvider); IEntityRepository<IICalendar, Uri, string> btypeRepository = new CalDavRepository ( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Event, dateTimeRangeProvider); var entityMapper = new EventEntityMapper ( _outlookEmailAddress, new Uri ("mailto:" + options.EmailAddress), _outlookSession.Application.TimeZones.CurrentTimeZone.ID, _outlookSession.Application.Version); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory<string, DateTime, AppointmentItemWrapper, Uri, string, IICalendar> ( entityMapper, atypeRepository, btypeRepository, outlookEventRelationDataFactory, ExceptionHandler.Instance ); var btypeIdEqualityComparer = EqualityComparer<Uri>.Default; var atypeIdEqualityComparer = EqualityComparer<string>.Default; var synchronizer = new Synchronizer<string, DateTime, AppointmentItemWrapper, Uri, string, IICalendar> ( atypeRepository, btypeRepository, InitialEventSyncStateCreationStrategyFactory.Create ( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution), entityRelationDataAccess, outlookEventRelationDataFactory, new InitialEventEntityMatcher (btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance); return new OutlookSynchronizer (synchronizer, atypeRepository); }
private IOutlookSynchronizer CreateTaskSynchronizer(Options options, GeneralOptions generalOptions, AvailableSynchronizerComponents componentsToFill) { var mappingParameters = GetMappingParameters <TaskMappingConfiguration> (options); var atypeRepository = new OutlookTaskRepository(_outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, _daslFilterProvider, mappingParameters); ICalDavDataAccess calDavDataAccess; var calendarUrl = new Uri(options.CalenderUrl); if (calendarUrl.Scheme == Uri.UriSchemeFile) { calDavDataAccess = new FileSystemDavDataAccess(calendarUrl); } else { calDavDataAccess = new CalDavDataAccess( calendarUrl, CreateWebDavClient( options.UserName, options.GetEffectivePassword(_outlookAccountPasswordProvider), options.CalenderUrl, generalOptions.CalDavConnectTimeout, options.ServerAdapterType, options.CloseAfterEachRequest, options.PreemptiveAuthentication, options.ForceBasicAuthentication, options.ProxyOptions, generalOptions.EnableClientCertificate, generalOptions.AcceptInvalidCharsInServerResponse)); } componentsToFill.CalDavDataAccess = calDavDataAccess; var btypeRepository = new CalDavRepository <int> ( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Todo, NullDateTimeRangeProvider.Instance, false, options.IsChunkedSynchronizationEnabled ? new ChunkedExecutor(options.ChunkSize) : NullChunkedExecutor.Instance); var relationDataFactory = new TaskRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> ( new TaskMapper(_outlookSession.Application.TimeZones.CurrentTimeZone.ID, mappingParameters), relationDataFactory, ExceptionHandler.Instance); var storageDataDirectory = _profileDataDirectoryFactory(options.Id); var btypeIdEqualityComparer = WebResourceName.Comparer; var atypeIdEqualityComparer = EqualityComparer <string> .Default; var atypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository); var btypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository); var synchronizer = new Synchronizer <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar, int> ( atypeRepository, btypeRepository, atypeWriteRepository, btypeWriteRepository, InitialSyncStateCreationStrategyFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> .Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution, e => new TaskConflictInitialSyncStateCreationStrategyAutomatic(e)), new EntityRelationDataAccess <string, DateTime, TaskRelationData, WebResourceName, string> (storageDataDirectory), relationDataFactory, new InitialTaskEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance, NullSynchronizationContextFactory.Instance, EqualityComparer <DateTime> .Default, EqualityComparer <string> .Default, syncStateFactory); return(new OutlookSynchronizer <WebResourceName, string> (synchronizer)); }
/// <remarks> /// Public because it is being used by integration tests /// </remarks> public async Task <IOutlookSynchronizer> CreateEventSynchronizer( Options options, ICalDavDataAccess calDavDataAccess, IEntityRelationDataAccess <AppointmentId, DateTime, WebResourceName, string> entityRelationDataAccess) { var dateTimeRangeProvider = options.IgnoreSynchronizationTimeRange ? NullDateTimeRangeProvider.Instance : new DateTimeRangeProvider(options.DaysToSynchronizeInThePast, options.DaysToSynchronizeInTheFuture); var mappingParameters = GetMappingParameters <EventMappingConfiguration> (options); var atypeRepository = new OutlookEventRepository( _outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, dateTimeRangeProvider, mappingParameters, _daslFilterProvider); IEntityRepository <WebResourceName, string, IICalendar, IEventSynchronizationContext> btypeRepository = new CalDavRepository <IEventSynchronizationContext> ( calDavDataAccess, new iCalendarSerializer(), CalDavRepository.EntityType.Event, dateTimeRangeProvider, options.ServerAdapterType == ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth, options.IsChunkedSynchronizationEnabled ? new ChunkedExecutor(options.ChunkSize) : NullChunkedExecutor.Instance); var timeZoneCache = new TimeZoneCache(CreateHttpClient(options.ProxyOptions), mappingParameters.IncludeHistoricalData, _globalTimeZoneCache); ITimeZone configuredEventTimeZoneOrNull; if (mappingParameters.UseIanaTz) { configuredEventTimeZoneOrNull = await timeZoneCache.GetByTzIdOrNull(mappingParameters.EventTz); } else { configuredEventTimeZoneOrNull = null; } var entityMapper = new EventEntityMapper( _outlookEmailAddress, new Uri("mailto:" + options.EmailAddress), _outlookSession.Application.TimeZones.CurrentTimeZone.ID, _outlookSession.Application.Version, timeZoneCache, mappingParameters, configuredEventTimeZoneOrNull); var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory(); var syncStateFactory = new EntitySyncStateFactory <AppointmentId, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar> ( entityMapper, outlookEventRelationDataFactory, ExceptionHandler.Instance ); var btypeIdEqualityComparer = WebResourceName.Comparer; var atypeIdEqualityComparer = AppointmentId.Comparer; var aTypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository); var bTypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository); var synchronizer = new Synchronizer <AppointmentId, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar, IEventSynchronizationContext> ( atypeRepository, btypeRepository, aTypeWriteRepository, bTypeWriteRepository, InitialSyncStateCreationStrategyFactory <AppointmentId, DateTime, AppointmentItemWrapper, WebResourceName, string, IICalendar> .Create( syncStateFactory, syncStateFactory.Environment, options.SynchronizationMode, options.ConflictResolution, e => new EventConflictInitialSyncStateCreationStrategyAutomatic(e)), entityRelationDataAccess, outlookEventRelationDataFactory, new InitialEventEntityMatcher(btypeIdEqualityComparer), atypeIdEqualityComparer, btypeIdEqualityComparer, _totalProgressFactory, ExceptionHandler.Instance, new EventSynchronizationContextFactory(atypeRepository, btypeRepository, entityRelationDataAccess, mappingParameters.CleanupDuplicateEvents, atypeIdEqualityComparer), EqualityComparer <DateTime> .Default, EqualityComparer <string> .Default, syncStateFactory, new EventSynchronizationInterceptorFactory()); return(new OutlookEventSynchronizer <WebResourceName, string> (synchronizer)); }