private List <T> InternalFind <T>(QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize) where T : IConfigurable, new() { if (!RequestJobProvider.IsRequestStatistics(typeof(T), false)) { throw new ArgumentException("RequestJobProvider can only find *RequestStatistics objects."); } List <T> list = new List <T>(); RequestJobQueryFilter requestJobQueryFilter = filter as RequestJobQueryFilter; if (requestJobQueryFilter != null) { MRSRequestType?requestType = requestJobQueryFilter.RequestType; Guid mdbGuid = requestJobQueryFilter.MdbGuid; Guid requestGuid = requestJobQueryFilter.RequestGuid; this.EnsureStoreConnectionExists(mdbGuid); Restriction restriction = null; if (requestType != null) { RequestJobNamedPropertySet requestJobNamedPropertySet = RequestJobNamedPropertySet.Get(this.SystemMailbox); restriction = Restriction.EQ(requestJobNamedPropertySet.PropTags[14], requestType.Value); if (requestType.Value == MRSRequestType.Move) { restriction = Restriction.Or(new Restriction[] { Restriction.Not(Restriction.Exist(requestJobNamedPropertySet.PropTags[14])), restriction }); } } byte[] searchKey = null; if (requestGuid != Guid.Empty) { searchKey = RequestJobXML.CreateMessageSearchKey(requestGuid); } List <RequestJobXML> list2 = MoveObjectInfo <RequestJobXML> .LoadAll(searchKey, restriction, mdbGuid, this.store, RequestJobXML.RequestJobsFolderName, new MoveObjectInfo <RequestJobXML> .IsSupportedObjectTypeDelegate(RequestJobXML.IsMessageTypeSupported), new MoveObjectInfo <RequestJobXML> .EmptyTDelegate(this.CreateDummyFromSearchKey)); if (list2 == null || list2.Count == 0) { MrsTracer.Common.Debug("No RequestJob messages found.", new object[0]); } else { foreach (RequestJobXML requestJobXML in list2) { RequestJobProvider.FixTenantInfo(requestJobXML); RequestStatisticsBase requestStatisticsBase = RequestJobProvider.CreateRequestStatistics(typeof(T), requestJobXML, true); requestStatisticsBase.OriginatingMDBGuid = mdbGuid; if (requestStatisticsBase.Identity == null) { requestStatisticsBase.Identity = new RequestJobObjectId(requestStatisticsBase.IdentifyingGuid, mdbGuid, null); } if (!requestStatisticsBase.IsFake) { using (this.IndexProvider.RescopeTo(requestStatisticsBase.DomainControllerToUpdate, requestStatisticsBase.OrganizationId)) { if (requestStatisticsBase.UserId != null) { requestStatisticsBase.User = this.IndexProvider.ReadADUser(requestStatisticsBase.UserId, requestStatisticsBase.ExchangeGuid); } if (requestStatisticsBase.SourceUserId != null) { requestStatisticsBase.SourceUser = this.IndexProvider.ReadADUser(requestStatisticsBase.SourceUserId, requestStatisticsBase.SourceExchangeGuid); } if (requestStatisticsBase.TargetUserId != null) { requestStatisticsBase.TargetUser = this.IndexProvider.ReadADUser(requestStatisticsBase.TargetUserId, requestStatisticsBase.TargetExchangeGuid); } if (!typeof(T).Equals(typeof(MoveRequestStatistics)) && requestStatisticsBase.RequestType != MRSRequestType.Move) { List <IRequestIndexEntry> list3 = new List <IRequestIndexEntry>(); if (requestStatisticsBase.IndexIds != null && requestStatisticsBase.IndexIds.Count > 0) { foreach (RequestIndexId indexId in requestStatisticsBase.IndexIds) { IRequestIndexEntry requestIndexEntry; try { requestIndexEntry = this.IndexProvider.Read(new RequestIndexEntryObjectId(requestStatisticsBase.RequestGuid, requestStatisticsBase.TargetExchangeGuid, requestStatisticsBase.RequestType, requestStatisticsBase.OrganizationId, indexId, null)); } catch (TenantOrgContainerNotFoundException) { requestIndexEntry = null; } if (requestIndexEntry != null) { list3.Add(requestIndexEntry); } } } requestStatisticsBase.IndexEntries = list3; } if (this.IndexProvider.DomainController == null && !string.IsNullOrEmpty(requestStatisticsBase.DomainControllerToUpdate)) { requestStatisticsBase.DomainControllerToUpdate = null; } } } requestStatisticsBase.ValidateRequestJob(); if (this.LoadReport) { ReportData reportData = new ReportData(requestStatisticsBase.IdentifyingGuid, requestStatisticsBase.ReportVersion); reportData.Load(this.SystemMailbox); requestStatisticsBase.Report = reportData.ToReport(); } if (requestStatisticsBase != null && requestStatisticsBase.GetType().Equals(typeof(T))) { list.Add((T)((object)requestStatisticsBase)); } } } } return(list); }
private byte[] CreateMessageSearchKey(ReportData report) { byte[] array = new byte[16]; report.IdentifyingGuid.ToByteArray().CopyTo(array, 0); return(array); }
public IConfigurable Read <T>(ObjectId identity, ReadJobFlags readJobFlags) where T : IConfigurable, new() { if (identity == null) { throw new ArgumentNullException("identity", "The identity of the object to be read must be specified."); } if (!(identity is RequestJobObjectId)) { throw new ArgumentException("RequestJobProvider can only identify RequestJobs based on RequestJobObjectIds.", "identity"); } if (!typeof(T).Equals(typeof(TransactionalRequestJob)) && !RequestJobProvider.IsRequestStatistics(typeof(T), true)) { throw new ArgumentException("RequestJobProvider can only Read *RequestStatistics or TransactionalRequestJob objects."); } bool flag = false; if (typeof(T).Equals(typeof(TransactionalRequestJob))) { flag = true; } RequestJobObjectId requestJobObjectId = (RequestJobObjectId)identity; Guid requestGuid = requestJobObjectId.RequestGuid; Guid mdbGuid = requestJobObjectId.MdbGuid; byte[] messageId = requestJobObjectId.MessageId; ADUser aduser = requestJobObjectId.User; ADUser aduser2 = requestJobObjectId.SourceUser; ADUser aduser3 = requestJobObjectId.TargetUser; IRequestIndexEntry indexEntry = requestJobObjectId.IndexEntry; List <IRequestIndexEntry> list = new List <IRequestIndexEntry>(); if (requestGuid == Guid.Empty || mdbGuid == Guid.Empty) { throw new NotEnoughInformationToFindMoveRequestPermanentException(); } this.EnsureStoreConnectionExists(mdbGuid); MoveObjectInfo <RequestJobXML> moveObjectInfo = null; IConfigurable result; try { moveObjectInfo = new MoveObjectInfo <RequestJobXML>(mdbGuid, this.store, messageId, RequestJobXML.RequestJobsFolderName, RequestJobXML.RequestJobsMessageClass, RequestJobXML.CreateMessageSubject(requestGuid), RequestJobXML.CreateMessageSearchKey(requestGuid)); RequestJobXML requestJobXML = null; if (moveObjectInfo.OpenMessage()) { if (moveObjectInfo.CheckObjectType(new MoveObjectInfo <RequestJobXML> .IsSupportedObjectTypeDelegate(RequestJobXML.IsMessageTypeSupported))) { requestJobXML = moveObjectInfo.ReadObject(ReadObjectFlags.DontThrowOnCorruptData); } else { MrsTracer.Common.Warning("Found unexpected JobType for move job {0}", new object[] { requestJobObjectId.ToString() }); } if (requestJobXML == null) { if (!this.AllowInvalid) { return(null); } requestJobXML = RequestJobBase.CreateDummyObject <RequestJobXML>(); requestJobXML.RequestGuid = requestGuid; requestJobXML.ExchangeGuid = requestGuid; } requestJobXML.OriginatingMDBGuid = mdbGuid; if (requestJobXML.Identity == null) { requestJobXML.Identity = requestJobObjectId; } requestJobXML.Identity.MessageId = moveObjectInfo.MessageId; RequestJobProvider.FixTenantInfo(requestJobXML); if (!requestJobXML.IsFake) { using (this.IndexProvider.RescopeTo(requestJobXML.DomainControllerToUpdate, requestJobXML.OrganizationId)) { if (aduser == null && requestJobXML.UserId != null) { aduser = this.IndexProvider.ReadADUser(requestJobXML.UserId, requestJobXML.ExchangeGuid); } if (aduser2 == null && requestJobXML.SourceUserId != null) { aduser2 = this.IndexProvider.ReadADUser(requestJobXML.SourceUserId, requestJobXML.SourceExchangeGuid); } if (aduser3 == null && requestJobXML.TargetUserId != null) { aduser3 = this.IndexProvider.ReadADUser(requestJobXML.TargetUserId, requestJobXML.TargetExchangeGuid); } if (!typeof(T).Equals(typeof(MoveRequestStatistics)) && requestJobXML.RequestType != MRSRequestType.Move && requestJobXML.IndexIds != null && requestJobXML.IndexIds.Count > 0) { int capacity = requestJobXML.IndexIds.Count - 1; bool flag2 = false; List <RequestIndexEntryObjectId> list2 = new List <RequestIndexEntryObjectId>(capacity); foreach (RequestIndexId requestIndexId in requestJobXML.IndexIds) { if (indexEntry != null && requestIndexId.Equals(indexEntry.RequestIndexId)) { if (!flag2) { list.Add(indexEntry); } flag2 = true; } else if (readJobFlags.HasFlag(ReadJobFlags.SkipReadingMailboxRequestIndexEntries) && requestIndexId.Location == RequestIndexLocation.Mailbox) { MrsTracer.Common.Debug("Skipping loading of an IRequestIndexEntry found in a mailbox.", new object[0]); } else { list2.Add(new RequestIndexEntryObjectId(requestJobXML.RequestGuid, requestJobXML.TargetExchangeGuid, requestJobXML.RequestType, requestJobXML.OrganizationId, requestIndexId, null)); } } foreach (RequestIndexEntryObjectId objectId in list2) { IRequestIndexEntry requestIndexEntry = this.IndexProvider.Read(objectId); if (requestIndexEntry != null) { list.Add(requestIndexEntry); } } } if (this.IndexProvider.DomainController == null && !string.IsNullOrEmpty(requestJobXML.DomainControllerToUpdate)) { requestJobXML.DomainControllerToUpdate = null; } } } requestJobXML.User = aduser; requestJobXML.SourceUser = aduser2; requestJobXML.TargetUser = aduser3; requestJobXML.IndexEntries = list; if (!readJobFlags.HasFlag(ReadJobFlags.SkipValidation)) { requestJobXML.ValidateRequestJob(); } if (this.AllowInvalid) { ValidationError[] array = requestJobXML.Validate(); if (array != null && array.Length > 0) { requestJobXML.IsFake = true; } } if (flag) { TransactionalRequestJob transactionalRequestJob = new TransactionalRequestJob(requestJobXML); requestJobXML.Retire(); transactionalRequestJob.Provider = this; transactionalRequestJob.MoveObject = moveObjectInfo; moveObjectInfo = null; result = transactionalRequestJob; } else { RequestStatisticsBase requestStatisticsBase = RequestJobProvider.CreateRequestStatistics(typeof(T), requestJobXML, true); if (requestStatisticsBase == null) { requestStatisticsBase = new MoveRequestStatistics(requestJobXML); requestJobXML.Retire(); } if (this.LoadReport) { ReportData reportData = new ReportData(requestStatisticsBase.IdentifyingGuid, requestStatisticsBase.ReportVersion); reportData.Load(this.SystemMailbox); requestStatisticsBase.Report = reportData.ToReport(); } result = requestStatisticsBase; } } else { result = null; } } finally { if (moveObjectInfo != null) { moveObjectInfo.Dispose(); moveObjectInfo = null; } } return(result); }