Esempio n. 1
0
        private Task <IReadOnlyList <EntityWithVersion <Uri, IICalendar> > > ParallelDeserialize(IReadOnlyList <EntityWithVersion <Uri, string> > serializedEntities)
        {
            return(Task.Factory.StartNew(() =>
            {
                var result = new List <EntityWithVersion <Uri, IICalendar> >();

                Parallel.ForEach(
                    serializedEntities,
                    () => Tuple.Create(new iCalendarSerializer(), new List <Tuple <Uri, IICalendar> >()),
                    (serialized, loopState, threadLocal) =>
                {
                    IICalendar calendar;

                    if (TryDeserializeCalendar(serialized.Entity, out calendar, serialized.Id, threadLocal.Item1))
                    {
                        threadLocal.Item2.Add(Tuple.Create(serialized.Id, calendar));
                    }
                    return threadLocal;
                },
                    threadLocal =>
                {
                    lock (result)
                    {
                        foreach (var calendar in threadLocal.Item2)
                        {
                            result.Add(EntityWithVersion.Create(calendar.Item1, calendar.Item2));
                        }
                    }
                });

                IReadOnlyList <EntityWithVersion <Uri, IICalendar> > readOnlyResult = result;
                return readOnlyResult;
            }));
        }
Esempio n. 2
0
        private IReadOnlyList <EntityWithVersion <Uri, vCard> > ParallelDeserialize(IReadOnlyList <EntityWithVersion <Uri, string> > serializedEntities)
        {
            var result = new List <EntityWithVersion <Uri, vCard> >();

            Parallel.ForEach(
                serializedEntities,
                () => Tuple.Create(new vCardStandardReader(), new List <Tuple <Uri, vCard> >()),
                (serialized, loopState, threadLocal) =>
            {
                vCard vcard;

                if (TryDeserialize(serialized.Entity, out vcard, serialized.Id, threadLocal.Item1))
                {
                    threadLocal.Item2.Add(Tuple.Create(serialized.Id, vcard));
                }
                return(threadLocal);
            },
                threadLocal =>
            {
                lock (result)
                {
                    foreach (var calendar in threadLocal.Item2)
                    {
                        result.Add(EntityWithVersion.Create(calendar.Item1, calendar.Item2));
                    }
                }
            });

            return(result);
        }
Esempio n. 3
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);
        }
        public void Synchronize_GetVersionsAndGetReturnDuplicateEntries_RemovesDuplicates()
        {
            var builder = new SynchronizerBuilder();

            builder.AtypeIdComparer = StringComparer.InvariantCultureIgnoreCase;

            builder.AtypeRepository
            .Expect(r => r.GetVersions(DateTime.Now, DateTime.Now))
            .IgnoreArguments()
            .Return(new[] { EntityIdWithVersion.Create("A1", "v1"), EntityIdWithVersion.Create("a1", "v3") });

            builder.BtypeRepository
            .Expect(r => r.GetVersions(DateTime.Now, DateTime.Now))
            .IgnoreArguments()
            .Return(new[] { EntityIdWithVersion.Create("b1", "v2") });


            Task <IReadOnlyList <EntityWithVersion <string, string> > > aTypeLoadTask = new Task <IReadOnlyList <EntityWithVersion <string, string> > > (
                () => new List <EntityWithVersion <string, string> > {
                EntityWithVersion.Create("A1", "AAAA"), EntityWithVersion.Create("a1", "____")
            });

            aTypeLoadTask.RunSynchronously();
            builder.AtypeRepository
            .Expect(r => r.Get(Arg <ICollection <string> > .Matches(c => c.Count == 1 && c.First() == "A1")))
            .Return(aTypeLoadTask);

            Task <IReadOnlyList <EntityWithVersion <string, string> > > bTypeLoadTask = new Task <IReadOnlyList <EntityWithVersion <string, string> > > (
                () => new List <EntityWithVersion <string, string> > {
                EntityWithVersion.Create("b1", "BBBB"),
            });

            bTypeLoadTask.RunSynchronously();
            builder.BtypeRepository
            .Expect(r => r.Get(Arg <ICollection <string> > .Matches(c => c.Count == 1 && c.First() == "b1")))
            .Return(bTypeLoadTask);


            var knownData = new EntityRelationDataString("A1", "v1", "b1", "v2");

            builder.InitialEntityMatcher
            .Expect(m => m.FindMatchingEntities(null, null, null, null, null))
            .IgnoreArguments()
            .Return(new List <IEntityRelationData <string, string, string, string> > {
                knownData
            });

            builder.InitialSyncStateCreationStrategy
            .Expect(s => s.CreateFor_Unchanged_Unchanged(knownData))
            .Return(new DoNothing <string, string, string, string, string, string> (knownData));

            var synchronizer = builder.Build();

            synchronizer.Synchronize().Wait();

            builder.SynchronizerContext.AssertWasCalled(
                c => c.SaveEntityRelationData(Arg <List <IEntityRelationData <string, string, string, string> > > .Matches(l => l.Count == 1 && l[0] == knownData)));
        }
Esempio n. 5
0
#pragma warning disable 1998
        public async Task <IReadOnlyList <EntityWithVersion <string, GenericComObjectWrapper <ContactItem> > > > Get(ICollection <string> ids)
#pragma warning restore 1998
        {
            return(ids
                   .Select(id => EntityWithVersion.Create(
                               id,
                               GenericComObjectWrapper.Create(
                                   (ContactItem)_mapiNameSpace.GetItemFromID(id, _folderStoreId))))
                   .ToArray());
        }
#pragma warning disable 1998
        public async Task <IReadOnlyList <EntityWithVersion <string, AppointmentItemWrapper> > > Get(ICollection <string> ids)
#pragma warning restore 1998
        {
            return(ids
                   .Select(id => EntityWithVersion.Create(
                               id,
                               new AppointmentItemWrapper(
                                   (AppointmentItem)_mapiNameSpace.GetItemFromID(id, _folderStoreId),
                                   entryId => (AppointmentItem)_mapiNameSpace.GetItemFromID(entryId, _folderStoreId))))
                   .ToArray());
        }
#pragma warning disable 1998
        public async Task <IReadOnlyList <EntityWithVersion <string, TaskItemWrapper> > > Get(ICollection <string> ids)
#pragma warning restore 1998
        {
            var storeId = _taskFolder.StoreID;

            return(ids
                   .Select(id => EntityWithVersion.Create(
                               id,
                               new TaskItemWrapper(
                                   (TaskItem)_mapiNameSpace.GetItemFromID(id, storeId),
                                   entryId => (TaskItem)_mapiNameSpace.GetItemFromID(entryId, storeId))))
                   .ToArray());
        }
        public IReadOnlyList <EntityWithVersion <Uri, string> > GetEntities(IEnumerable <Uri> eventUrls)
        {
            var requestBody = @"<?xml version=""1.0""?>
			                    <C:calendar-multiget xmlns:C=""urn:ietf:params:xml:ns:caldav"" xmlns:D=""DAV:"">
			                        <D:prop>
			                            <D:getetag/>
			                            <D:displayname/>
			                            <C:calendar-data/>
			                        </D:prop>
                                        " + String.Join(Environment.NewLine, eventUrls.Select(u => string.Format("<D:href>{0}</D:href>", u))) + @"
                                    </C:calendar-multiget>";

            var responseXml = _calDavWebClient.ExecuteCalDavRequestAndReadResponse(
                _calendarUrl,
                request =>
            {
                request.Method      = "REPORT";
                request.ContentType = "text/xml; charset=UTF-8";
                request.Headers.Add("Depth", "1");
                request.ServicePoint.Expect100Continue = false;
                request.Headers.Add(HttpRequestHeader.AcceptCharset, "utf-8");
            },
                requestBody
                );

            XmlNodeList responseNodes = responseXml.XmlDocument.SelectNodes("/D:multistatus/D:response", responseXml.XmlNamespaceManager);

            var entities = new List <EntityWithVersion <Uri, string> >();

            if (responseNodes == null)
            {
                return(entities);
            }

            // ReSharper disable once LoopCanBeConvertedToQuery
            // ReSharper disable once PossibleNullReferenceException
            foreach (XmlElement responseElement in responseNodes)
            {
                var urlNode  = responseElement.SelectSingleNode("D:href", responseXml.XmlNamespaceManager);
                var dataNode = responseElement.SelectSingleNode("D:propstat/D:prop/C:calendar-data", responseXml.XmlNamespaceManager);
                if (urlNode != null && dataNode != null)
                {
                    entities.Add(EntityWithVersion.Create(UriHelper.UnescapeRelativeUri(_calendarUrl, urlNode.InnerText), dataNode.InnerText));
                }
            }

            return(entities);
        }
        public async Task <IReadOnlyList <EntityWithVersion <Uri, string> > > GetEntities(IEnumerable <Uri> urls)
        {
            var requestBody = @" <?xml version=""1.0"" encoding=""utf-8"" ?>
   <C:addressbook-multiget xmlns:D=""DAV:"" xmlns:C=""urn:ietf:params:xml:ns:carddav"">
     <D:prop>
       <D:getetag/>
       <C:address-data/>
     </D:prop>
     " + String.Join(Environment.NewLine, urls.Select(u => string.Format("<D:href>{0}</D:href>", u))) + @"
   </C:addressbook-multiget>
 ";


            var responseXml = await _webDavClient.ExecuteWebDavRequestAndReadResponse(
                _serverUrl,
                request =>
            {
                request.Method = new System.Net.Http.HttpMethod("REPORT");
                request.Headers.Add("Depth", "1");
                //request.Headers.Add (HttpRequestHeader.AcceptCharset, "utf-8");
            },
                "application/xml",
                requestBody
                );

            XmlNodeList responseNodes = responseXml.XmlDocument.SelectNodes("/D:multistatus/D:response", responseXml.XmlNamespaceManager);

            var entities = new List <EntityWithVersion <Uri, string> >();

            if (responseNodes == null)
            {
                return(entities);
            }

            // ReSharper disable once LoopCanBeConvertedToQuery
            // ReSharper disable once PossibleNullReferenceException
            foreach (XmlElement responseElement in responseNodes)
            {
                var urlNode  = responseElement.SelectSingleNode("D:href", responseXml.XmlNamespaceManager);
                var dataNode = responseElement.SelectSingleNode("D:propstat/D:prop/A:address-data", responseXml.XmlNamespaceManager);
                if (urlNode != null && dataNode != null)
                {
                    entities.Add(EntityWithVersion.Create(UriHelper.UnescapeRelativeUri(_serverUrl, urlNode.InnerText), dataNode.InnerText));
                }
            }

            return(entities);
        }
Esempio n. 10
0
        public static void SyncCalDavToOutlook(string eventData, IEntityRelationDataAccess <string, DateTime, Uri, string> entityRelationDataAccess)
        {
            var 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, eventData) }));

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

            WaitForTask(synchronizer.Synchronize());
        }
 // ReSharper disable once CSharpWarnings::CS1998
 public async Task <IReadOnlyList <EntityWithVersion <string, string> > > Get(ICollection <string> ids)
 {
     return(ids.Select(id => EntityWithVersion.Create(id, EntityVersionAndContentById[id].Item2)).ToArray());
 }
Esempio n. 12
0
 public Task <IReadOnlyList <EntityWithVersion <Identifier, string> > > Get(ICollection <Identifier> ids)
 {
     return(Task.FromResult <IReadOnlyList <EntityWithVersion <Identifier, string> > > (
                ids.Select(id => EntityWithVersion.Create(id, EntityVersionAndContentById[id].Item2)).ToArray()));
 }