public static List <AggregateFeedItem> FromFeedItems(IList <FeedItem> feedItems) { #region comments /* AC: While this works, it won't serve at the moment * LinkedList<FeedItem> feedItemsLinkedList = new LinkedList<FeedItem>(feedItems); * LinkedListNode<FeedItem> node = feedItemsLinkedList.First; * LinkedListNode<FeedItem> next; * bool isOnBuildEvent = false; * int lastAuthorId = 0; * IOsbideEvent lastEvent = new BuildEvent(); * while (node != null) * { * next = node.Next; * if (node.Value != null) * { * if (node.Value.Log.LogType.CompareTo(BuildEvent.Name) == 0) * { * BuildEvent build = node.Value.Event as BuildEvent; * if (build != null) * { * //is this an empty error build event? * if (build.CriticalErrorCount == 0) * { * //have we already seen one immediately before this one? If so, * //remove from the event chain. * if (isOnBuildEvent == true * && lastAuthorId == node.Value.Log.SenderId * && lastEvent.SolutionName.CompareTo(node.Value.Event.SolutionName) == 0 * ) * { * feedItemsLinkedList.Remove(node); * } * else * { * isOnBuildEvent = true; * } * } * } * } * else * { * isOnBuildEvent = false; * } * } * lastAuthorId = node.Value.Log.SenderId; * lastEvent = node.Value.Event; * node = next; * } * feedItems = feedItemsLinkedList.ToList(); * */ #endregion List <AggregateFeedItem> aggregateItems = new List <AggregateFeedItem>(); //prime the loop FeedItem previousItem = null; AggregateFeedItem currentAggregate = null; if (feedItems.Count > 0) { currentAggregate = new AggregateFeedItem(feedItems[0]); //AC: LogCommentEvents work a little differenty. Their comments come from the event to which they point // and not themselves. //if (feedItems[0].Event.EventName == LogCommentEvent.Name) //{ // currentAggregate.Comments = currentAggregate.Comments.Union((feedItems[0].Event as LogCommentEvent).SourceEventLog.Comments).ToList(); //} aggregateItems.Add(currentAggregate); previousItem = feedItems[0]; } for (int i = 1; i < feedItems.Count; i++) { FeedItem item = feedItems[i]; if ( AcceptableAggregates.Contains(item.Event.EventName) == true && //Do we care about this type of event? previousItem.Event.SenderId == item.Event.SenderId && //Is the sender the same? previousItem.Event.EventName.CompareTo(item.Event.EventName) == 0 //is it of the same event type? ) { currentAggregate.Items.Add(item); currentAggregate.Comments = currentAggregate.Comments.Union(item.Comments).ToList(); //currentAggregate.HelpfulMarks += item.HelpfulComments; } else { currentAggregate = new AggregateFeedItem(item); //AC: LogCommentEvents work a little differenty. Their comments come from the event to which they point // and not themselves. if (item.Event.EventName == LogCommentEvent.Name) { //currentAggregate.Comments = currentAggregate.Comments.Union((item.Event as LogCommentEvent).SourceEventLogId.Comments).ToList(); } aggregateItems.Add(currentAggregate); } previousItem = item; } foreach (var item in aggregateItems) { if (item.Items.First().Event.IsAnonymous != null ? item.Items.First().Event.IsAnonymous : false) { item.Items.First().Event.SenderId = 0; item.Creator.ID = 0; item.Items.First().Event.ShowProfilePicture = false; item.Items.First().Event.HideMail = true; item.Items.First().Event.CanMail = false; item.Items.First().Event.Sender = new UserProfile { ID = 0, FirstName = "Anonymous ", LastName = item.Items.First().Event.EventId.ToString(), }; item.Items.First().Event.DisplayTitle = "Anonymous " + item.Items.First().Event.EventId.ToString(); } foreach (var comment in item.Comments) { if (comment.IsAnonymous != null ? comment.IsAnonymous : false) { comment.SenderId = 0; //item.Creator.ID = 0; comment.ShowProfilePicture = false; comment.HideMail = true; comment.CanMail = false; comment.Sender = new UserProfile { ID = 0, FirstName = "Anonymous ", LastName = comment.EventId.ToString(), }; comment.DisplayTitle = "Anonymous " + item.Items.First().Event.EventId.ToString(); } } } return(aggregateItems); }