コード例 #1
0
        public static IOutlookSynchronizer CreateEventSynchronizer(
            SynchronizationMode mode,
            ICalDavDataAccess calDavDataAccess,
            IEntityRelationDataAccess <string, DateTime, WebResourceName, string> entityRelationDataAccess = null,
            Action <Options> optionsModifier = null)
        {
            var options = new Options()
            {
                ConflictResolution             = ConflictResolution.Automatic,
                EmailAddress                   = "*****@*****.**",
                IgnoreSynchronizationTimeRange = true,
                OutlookFolderEntryId           = s_outlookFolderEntryId,
                OutlookFolderStoreId           = s_outlookFolderStoreId,
                SynchronizationMode            = mode,
                CalenderUrl = "http://invalidurl.net"
            };

            if (optionsModifier != null)
            {
                optionsModifier(options);
            }

            return(s_synchronizerFactory.CreateEventSynchronizer(
                       options,
                       calDavDataAccess,
                       entityRelationDataAccess ?? MockRepository.GenerateStub <IEntityRelationDataAccess <string, DateTime, WebResourceName, string> >()));
        }
コード例 #2
0
    public static IOutlookSynchronizer CreateEventSynchronizer (
        SynchronizationMode mode,
        ICalDavDataAccess calDavDataAccess,
        IEntityRelationDataAccess<string, DateTime, Uri, string> entityRelationDataAccess = null,
        Action<Options> optionsModifier = null)
    {
      var options = new Options()
                    {
                        ConflictResolution = ConflictResolution.Automatic,
                        EmailAddress = "*****@*****.**",
                        IgnoreSynchronizationTimeRange = true,
                        OutlookFolderEntryId = s_outlookFolderEntryId,
                        OutlookFolderStoreId = s_outlookFolderStoreId,
                        SynchronizationMode = mode,
                        CalenderUrl = "http://invalidurl.net"
                    };

      if (optionsModifier != null)
        optionsModifier (options);

      return s_synchronizerFactory.CreateEventSynchronizer (
          options,
          calDavDataAccess,
          entityRelationDataAccess ?? MockRepository.GenerateStub<IEntityRelationDataAccess<string, DateTime, Uri, string>>());
    }
コード例 #3
0
 public CalDavRepository(ICalDavDataAccess calDavDataAccess, IStringSerializer calendarSerializer, EntityType entityType, IDateTimeRangeProvider dateTimeRangeProvider)
 {
     _calDavDataAccess      = calDavDataAccess;
     _calendarSerializer    = calendarSerializer;
     _entityType            = entityType;
     _dateTimeRangeProvider = dateTimeRangeProvider;
 }
コード例 #4
0
        public static List <string> SyncOutlookToCalDav_CalDavIsEmpty(
            IEntityRelationDataAccess <string, DateTime, WebResourceName, string> entityRelationDataAccess = null,
            Action <Options> optionsModifier = null)
        {
            var calDavEvents = new List <string>();

            ICalDavDataAccess calDavDataAccess = MockRepository.GenerateMock <ICalDavDataAccess>();


            calDavDataAccess
            .Expect(r => r.GetEventVersions(null))
            .IgnoreArguments()
            .Return(Task.FromResult <IReadOnlyList <EntityVersion <WebResourceName, string> > > (
                        new EntityVersion <WebResourceName, string>[] { }));
            calDavDataAccess
            .Expect(r => r.CreateEntity(null, Guid.NewGuid().ToString()))
            .IgnoreArguments()
            .Return(Task.FromResult(
                        EntityVersion.Create(new WebResourceName("http://bla.com"), "blubb")))
            .WhenCalled(a => calDavEvents.Add((string)a.Arguments[0]));
            var synchronizer = CreateEventSynchronizer(
                SynchronizationMode.ReplicateOutlookIntoServer,
                calDavDataAccess,
                entityRelationDataAccess,
                optionsModifier);

            WaitForTask(synchronizer.SynchronizeNoThrow(NullSynchronizationLogger.Instance));
            return(calDavEvents);
        }
コード例 #5
0
        public void Initialize()
        {
            var applicationDataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CalDavSynchronizer");

            var optionsDataAccess = new OptionsDataAccess(
                Path.Combine(
                    applicationDataDirectory,
                    ComponentContainer.GetOrCreateConfigFileName(applicationDataDirectory, "Outlook")
                    ));

            var options = optionsDataAccess.LoadOptions().Single(o => o.Name == ProfileName);

            if (ServerAdapterTypeOverride.HasValue)
            {
                options.ServerAdapterType = ServerAdapterTypeOverride.Value;
            }

            _calDavDataAccess = new CalDavDataAccess(
                new Uri(options.CalenderUrl),
                SynchronizerFactory.CreateWebDavClient(
                    options,
                    TimeSpan.FromSeconds(30),
                    new OutlookAccountPasswordProvider("Outlook", "16.0.0.4266"),
                    new GeneralOptionsDataAccess().LoadOptions()));
        }
コード例 #6
0
        public static string SyncOutlookToCalDav_EventsExistsInCalDav(string existingEventData, IEntityRelationDataAccess <string, DateTime, Uri, string> entityRelationDataAccess = null)
        {
            string            roundTrippedData = null;
            ICalDavDataAccess calDavDataAccess = MockRepository.GenerateMock <ICalDavDataAccess>();
            var entityUri = new Uri("/e1", UriKind.Relative);

            calDavDataAccess
            .Expect(r => r.GetEvents(null))
            .IgnoreArguments()
            .Return(Task.FromResult <IReadOnlyList <EntityIdWithVersion <Uri, string> > > (
                        new[] { EntityIdWithVersion.Create(entityUri, "v1") }));

            calDavDataAccess
            .Expect(r => r.GetEntities(Arg <ICollection <Uri> > .List.Equal(new[] { entityUri })))
            .Return(Task.FromResult <IReadOnlyList <EntityWithVersion <Uri, string> > > (
                        new[] { EntityWithVersion.Create(entityUri, existingEventData) }));

            calDavDataAccess
            .Expect(r => r.UpdateEntity(new Uri("http://bla.com"), null))
            .IgnoreArguments()
            .Return(Task.FromResult <EntityIdWithVersion <Uri, string> > (
                        EntityIdWithVersion.Create(new Uri("http://bla.com"), "blubb")))
            .WhenCalled(a => { roundTrippedData = (string)a.Arguments[1]; });

            ISynchronizer synchronizer = OutlookTestContext.CreateEventSynchronizer(
                SynchronizationMode.ReplicateOutlookIntoServer,
                calDavDataAccess,
                entityRelationDataAccess);

            WaitForTask(synchronizer.Synchronize());

            return(roundTrippedData);
        }
コード例 #7
0
        /// <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));
        }
コード例 #8
0
 public CalDavRepository(
     ICalDavDataAccess calDavDataAccess,
     IStringSerializer calendarSerializer,
     EntityType entityType,
     IDateTimeRangeProvider dateTimeRangeProvider,
     bool deleteAndCreateOnUpdateError403)
 {
     _deleteAndCreateOnUpdateError403 = deleteAndCreateOnUpdateError403;
     _calDavDataAccess      = calDavDataAccess;
     _calendarSerializer    = calendarSerializer;
     _entityType            = entityType;
     _dateTimeRangeProvider = dateTimeRangeProvider;
 }
コード例 #9
0
    public void Initialize ()
    {
      var applicationDataDirectory = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "CalDavSynchronizer");

      var optionsDataAccess = new OptionsDataAccess (
          Path.Combine (
              applicationDataDirectory,
              ComponentContainer.GetOrCreateConfigFileName (applicationDataDirectory, "Outlook")
              ));

      var options = optionsDataAccess.LoadOptions().Single (o => o.Name == ProfileName);

      if (ServerAdapterTypeOverride.HasValue)
        options.ServerAdapterType = ServerAdapterTypeOverride.Value;

      _calDavDataAccess = new CalDavDataAccess (
          new Uri (options.CalenderUrl),
          SynchronizerFactory.CreateWebDavClient (options, TimeSpan.FromSeconds (30)));
    }
コード例 #10
0
        public void Initialize()
        {
            var applicationDataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CalDavSynchronizer");

            var optionsDataAccess = new OptionsDataAccess(
                Path.Combine(
                    applicationDataDirectory,
                    ComponentContainer.GetOrCreateConfigFileName(applicationDataDirectory, "Outlook")
                    ));

            var options = optionsDataAccess.LoadOptions().Single(o => o.Name == ProfileName);

            _calDavDataAccess = SynchronizerFactory.CreateCalDavDataAccess(
                options.CalenderUrl,
                options.UserName,
                options.Password,
                TimeSpan.FromSeconds(30),
                options.ServerAdapterType);
        }
コード例 #11
0
    public void Initialize ()
    {
      var applicationDataDirectory = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "CalDavSynchronizer");

      var optionsDataAccess = new OptionsDataAccess (
          Path.Combine (
              applicationDataDirectory,
              ComponentContainer.GetOrCreateConfigFileName (applicationDataDirectory, "Outlook")
              ));

      var options = optionsDataAccess.LoadOptions().Single (o => o.Name == ProfileName);

      _calDavDataAccess = SynchronizerFactory.CreateCalDavDataAccess (
          options.CalenderUrl,
          options.UserName,
          options.Password,
          TimeSpan.FromSeconds (30),
          options.ServerAdapterType);
    }
コード例 #12
0
        public static string SyncOutlookToCalDav_EventsExistsInCalDav(string existingEventData, IEntityRelationDataAccess <AppointmentId, DateTime, WebResourceName, string> entityRelationDataAccess = null)
        {
            string            roundTrippedData = null;
            ICalDavDataAccess calDavDataAccess = MockRepository.GenerateMock <ICalDavDataAccess>();
            var entityUri = new WebResourceName("/e1");

            calDavDataAccess
            .Expect(r => r.GetEventVersions(null))
            .IgnoreArguments()
            .Return(Task.FromResult <IReadOnlyList <EntityVersion <WebResourceName, string> > > (
                        new[] { EntityVersion.Create(entityUri, "v1") }));

            calDavDataAccess
            .Expect(r => r.GetEntities(Arg <ICollection <WebResourceName> > .List.Equal(new[] { entityUri })))
            .Return(Task.FromResult <IReadOnlyList <EntityWithId <WebResourceName, string> > > (
                        new[] { EntityWithId.Create(entityUri, existingEventData) }));

            calDavDataAccess
            .Expect(r => r.TryUpdateEntity(
                        new WebResourceName("http://bla.com"),
                        null,
                        null))
            .IgnoreArguments()
            .Return(Task.FromResult <EntityVersion <WebResourceName, string> > (
                        EntityVersion.Create(new WebResourceName("http://bla.com"), "blubb")))
            .WhenCalled(a => { roundTrippedData = (string)a.Arguments[2]; });

            var synchronizer = OutlookTestContext.CreateEventSynchronizer(
                SynchronizationMode.ReplicateOutlookIntoServer,
                calDavDataAccess,
                entityRelationDataAccess);

            WaitForTask(synchronizer.SynchronizeNoThrow(NullSynchronizationLogger.Instance));

            return(roundTrippedData);
        }
コード例 #13
0
 public CalDavRepository(ICalDavDataAccess calDavDataAccess, IStringSerializer calendarSerializer, EntityType entityType)
 {
     _calDavDataAccess   = calDavDataAccess;
     _calendarSerializer = calendarSerializer;
     _entityType         = entityType;
 }
コード例 #14
0
        /// <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));
        }
コード例 #15
0
    /// <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);
    }
コード例 #16
0
 public CalendarResourceResolver(ICalDavDataAccess calDavDataAccess)
 {
     _calDavDataAccess = calDavDataAccess ?? throw new ArgumentNullException(nameof(calDavDataAccess));
 }
コード例 #17
0
        /// <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));
        }