示例#1
0
        public override void Process(DirectoryQueryParameters item)
        {
            Recorder.Trace(4L, TraceType.InfoTrace, new object[]
            {
                "DirectoryLookup.Process Query:",
                item.Query,
                "ExpandPublicFolders:",
                item.ExpandPublicFolders,
                "ExpandGroups:",
                item.ExpandGroups,
                "MatchRecipientsToSources:",
                item.MatchRecipientsToSources
            });
            List <SearchSource> list = null;

            if (item.ExpandPublicFolders)
            {
                Recorder.Trace(4L, TraceType.InfoTrace, "DirectoryLookup.Process ExpandPublicFolders");
                list = new List <SearchSource>();
            }
            Dictionary <SearchSource, bool> matchMap = null;

            if (item.MatchRecipientsToSources)
            {
                Recorder.Trace(4L, TraceType.InfoTrace, "DirectoryLookup.Process MatchRecipients");
                matchMap = new Dictionary <SearchSource, bool>();
                item.Sources.ForEach(delegate(SearchSource t)
                {
                    matchMap[t] = false;
                });
            }
            IDirectoryProvider directoryProvider = SearchFactory.Current.GetDirectoryProvider(base.Executor.Policy);

            foreach (SearchRecipient recipient in directoryProvider.Query(base.Executor.Policy, item))
            {
                if (item.MatchRecipientsToSources)
                {
                    this.EnqueueMatches(recipient, matchMap, list);
                }
                else
                {
                    SearchSource source = this.CreateDefaultSource(null, recipient);
                    this.EnqueueSource(source, list);
                }
            }
            if (item.MatchRecipientsToSources)
            {
                foreach (SearchSource searchSource in from t in matchMap
                         where !t.Value
                         select t.Key)
                {
                    Recorder.Trace(4L, TraceType.WarningTrace, new object[]
                    {
                        "DirectoryLookup.Process FailedSource:",
                        searchSource.ReferenceId,
                        "FailedSourceType:",
                        searchSource.SourceType
                    });
                    base.Executor.Fail(new SearchException(KnownError.ErrorSearchableObjectNotFound)
                    {
                        ErrorSource = searchSource
                    });
                }
            }
            if (item.ExpandPublicFolders && list.Count > 0)
            {
                Recorder.Trace(4L, TraceType.WarningTrace, "DirectoryLookup.Process ExapndPublicFolders Count:", list.Count);
                ISourceConverter sourceConverter = SearchFactory.Current.GetSourceConverter(base.Policy, SourceType.PublicFolder);
                foreach (SearchSource searchSource2 in sourceConverter.Convert(base.Policy, this.GetPublicFolderSources(list)))
                {
                    QueryFilter sourceFilter = SearchRecipient.GetSourceFilter(searchSource2);
                    item.Query    = sourceFilter;
                    item.PageSize = 1;
                    using (IEnumerator <SearchRecipient> enumerator4 = directoryProvider.Query(base.Policy, item).GetEnumerator())
                    {
                        if (enumerator4.MoveNext())
                        {
                            SearchRecipient searchRecipient = enumerator4.Current;
                            searchSource2.Recipient.ADEntry = searchRecipient.ADEntry;
                            this.EnqueueSource(searchSource2, null);
                        }
                    }
                }
            }
        }
示例#2
0
        private void ProcessPublicFolders(DirectoryQueryParameters item, SearchSource allPublicFolders, List <SearchSource> publicFolders)
        {
            Recorder.Trace(4L, TraceType.InfoTrace, new object[]
            {
                "DirectoryQueryFormatting.ProcessPublicFolders AllPublicFolders:",
                allPublicFolders,
                "MailboxFilterPairs:",
                publicFolders
            });
            List <QueryFilter> list            = new List <QueryFilter>();
            List <string>      list2           = new List <string>();
            ISourceConverter   sourceConverter = SearchFactory.Current.GetSourceConverter(base.Policy, SourceType.PublicFolder);

            if (allPublicFolders != null || publicFolders.Count > 0)
            {
                List <SearchSource>        list3      = new List <SearchSource>();
                IEnumerable <SearchSource> enumerable = (allPublicFolders == null) ? publicFolders : ((IEnumerable <SearchSource>) new SearchSource[]
                {
                    allPublicFolders
                });
                Recorder.Trace(4L, TraceType.InfoTrace, "DirectoryQueryFormatting.ProcessPublicFolders PublicFolderList:", enumerable);
                foreach (SearchSource searchSource in sourceConverter.Convert(base.Policy, enumerable))
                {
                    Recorder.Trace(4L, TraceType.InfoTrace, new object[]
                    {
                        "DirectoryQueryFormatting.ProcessPublicFolders Source:",
                        searchSource.ReferenceId,
                        "SourceType:",
                        searchSource.SourceType
                    });
                    if (searchSource.SourceType != SourceType.PublicFolder)
                    {
                        QueryFilter sourceFilter = SearchRecipient.GetSourceFilter(searchSource);
                        if (sourceFilter != null)
                        {
                            Recorder.Trace(4L, TraceType.InfoTrace, new object[]
                            {
                                "DirectoryQueryFormatting.ProcessPublicFolders Source:",
                                searchSource.ReferenceId,
                                "SourceType:",
                                searchSource.SourceType,
                                "Filter:",
                                sourceFilter
                            });
                            list3.Add(searchSource);
                            if (list2.Contains(searchSource.ReferenceId))
                            {
                                continue;
                            }
                            list.Add(sourceFilter);
                            list2.Add(searchSource.ReferenceId);
                            if (list.Count >= item.PageSize)
                            {
                                this.Enqueue(item, list3, list);
                                list3.Clear();
                                list2.Clear();
                                list.Clear();
                                continue;
                            }
                            continue;
                        }
                    }
                    Recorder.Trace(4L, TraceType.ErrorTrace, "DirectoryQueryFormatting.ProcessPublicFolders FailedSource:", searchSource.ReferenceId);
                    base.Executor.Fail(new SearchException(KnownError.ErrorSearchableObjectNotFound)
                    {
                        ErrorSource = searchSource
                    });
                }
                this.Enqueue(item, list3, list);
            }
        }