private static IConversationClutterProcessor CreateInternal(IStoreSession session)
        {
            IConversationClutterProcessor result = null;
            MailboxSession mailboxSession        = session as MailboxSession;

            if (mailboxSession != null && ClutterUtilities.IsClutterEnabled(mailboxSession, mailboxSession.MailboxOwner.GetConfiguration()))
            {
                result = new FolderBasedConversationClutterProcessor(mailboxSession);
            }
            return(result);
        }
        internal AggregateOperationResult ProcessItems(ConversationAction actionsFilter, Conversation conversation)
        {
            Util.ThrowOnNullArgument(conversation, "conversation");
            EnumValidator.ThrowIfInvalid <ConversationAction>(actionsFilter, "actionsFilter");
            if (!conversation.ConversationId.Equals(this.ConversationId))
            {
                throw new ArgumentException("Conversation ID of passed conversation doesn't match with id of the action item");
            }
            List <GroupOperationResult> list = new List <GroupOperationResult>();

            if (!this.IsCorrectVersion())
            {
                return(Folder.CreateAggregateOperationResult(list));
            }
            ConversationAction conversationAction = this.EnabledActions & actionsFilter;

            if ((conversationAction & ConversationAction.AlwaysMoveOrDelete) != ConversationAction.None)
            {
                LocalizedException ex = null;
                try
                {
                    this.ValidateTargetFolderId(this.TargetFolderId);
                }
                catch (ObjectNotFoundException ex2)
                {
                    ex = ex2;
                }
                catch (InvalidFolderTypeException ex3)
                {
                    ex = ex3;
                }
                if (ex != null)
                {
                    list.Add(new GroupOperationResult(OperationResult.Failed, new StoreObjectId[0], ex));
                    conversationAction &= ~(ConversationAction.AlwaysMove | ConversationAction.AlwaysDelete);
                }
            }
            if ((conversationAction & ConversationAction.AlwaysClutterOrUnclutter) != ConversationAction.None)
            {
                MailboxSession mailboxSession = base.Session as MailboxSession;
                if (mailboxSession != null)
                {
                    IConversationClutterProcessor conversationClutterProcessor = ConversationClutterProcessorFactory.Create(mailboxSession);
                    if (conversationClutterProcessor != null)
                    {
                        this.processStats.UpdateCount = this.processStats.UpdateCount + (long)conversationClutterProcessor.Process(this.AlwaysClutterOrUnclutterValue.Value, conversation.ConversationTree, list);
                    }
                }
            }
            if ((conversationAction & ConversationAction.AlwaysCategorize) != ConversationAction.None)
            {
                this.processStats.UpdateCount = this.processStats.UpdateCount + (long)this.UpdateItems(conversation.ConversationTree, list);
            }
            else if (this.ConversationActionLastCategorySet != null)
            {
                this.processStats.UpdateCount = this.processStats.UpdateCount + (long)this.UpdateItems(conversation.ConversationTree, list);
            }
            if ((conversationAction & ConversationAction.AlwaysMoveOrDelete) != ConversationAction.None)
            {
                this.processStats.MoveCount = (long)this.MoveItems(conversation.ConversationTree, list, false);
            }
            else if (this.ConversationActionLastMoveFolderId != null)
            {
                if (this.ConversationActionLastMoveFolderId.Length == 0)
                {
                    this.processStats.UpdateCount = this.processStats.UpdateCount + (long)this.MoveItems(conversation.ConversationTree, list, true);
                }
                else
                {
                    this.ConversationActionLastMoveFolderId = null;
                }
            }
            return(Folder.CreateAggregateOperationResult(list));
        }