internal RequestJobObjectId(ADUser adUser)
        {
            if (adUser == null)
            {
                throw new ArgumentNullException("adUser", "An ADUser must be provided to this constructor");
            }
            this.adUser     = adUser;
            this.sourceUser = null;
            this.targetUser = null;
            this.indexEntry = null;
            Guid a;
            Guid a2;

            RequestIndexEntryProvider.GetMoveGuids(adUser, out a, out a2);
            if (a != Guid.Empty && a2 != Guid.Empty)
            {
                this.requestGuid = a;
                this.mdbGuid     = a2;
            }
            else
            {
                this.requestGuid = adUser.ExchangeGuid;
                this.mdbGuid     = Guid.Empty;
            }
            this.messageId = null;
        }
示例#2
0
        public override MRSRequestMailboxEntry Read(RequestIndexEntryProvider requestIndexEntryProvider, RequestIndexEntryObjectId identity)
        {
            this.ValidateRequestIndexId(identity.IndexId);
            ADUser aduser = requestIndexEntryProvider.ReadADUser(identity.IndexId.Mailbox, Guid.Empty);

            if (aduser == null)
            {
                return(null);
            }
            ExchangePrincipal      mailboxOwner = ExchangePrincipal.FromADUser(aduser, RemotingOptions.AllowCrossSite);
            MRSRequestMailboxEntry result;

            using (MailboxSession mailboxSession = MailboxSession.OpenAsAdmin(mailboxOwner, CultureInfo.InvariantCulture, "Client=MSExchangeMigration"))
            {
                MailboxStoreTypeProvider session = new MailboxStoreTypeProvider(aduser)
                {
                    MailboxSession = mailboxSession
                };
                MRSRequestMailboxEntry mrsrequestMailboxEntry = MRSRequest.Read <MRSRequestMailboxEntry>(session, identity.RequestGuid);
                mrsrequestMailboxEntry.RequestIndexId = identity.IndexId;
                mrsrequestMailboxEntry.OrganizationId = identity.OrganizationId;
                result = mrsrequestMailboxEntry;
            }
            return(result);
        }
        public override T Read(RequestIndexEntryProvider requestIndexEntryProvider, RequestIndexEntryObjectId identity)
        {
            ArgumentValidator.ThrowIfNull("targetExchangeGuid", identity.TargetExchangeGuid);
            ADRecipient adrecipient = requestIndexEntryProvider.Read <ADRecipient>((IRecipientSession session) => session.FindByExchangeGuidIncludingAlternate(identity.TargetExchangeGuid));

            if (adrecipient == null)
            {
                MrsTracer.Common.Warning("No ADRecipient found with ExchangeGuid '{0}' including alternates.", new object[]
                {
                    identity.TargetExchangeGuid
                });
                return(default(T));
            }
            ADUser aduser = adrecipient as ADUser;

            if (aduser == null)
            {
                MrsTracer.Common.Warning("'{0}' is not a user.", new object[]
                {
                    adrecipient.Id.ToString()
                });
                return(default(T));
            }
            T t = Activator.CreateInstance <T>();

            t.TargetUser         = aduser;
            t.TargetExchangeGuid = identity.TargetExchangeGuid;
            t.TargetMDB          = aduser.Database;
            T result = t;

            result.RequestGuid = identity.RequestGuid;
            result.SetExchangePrincipal();
            return(result);
        }
        public IConfigurable Read <T>(ObjectId identity) where T : IConfigurable, new()
        {
            if (identity == null)
            {
                throw new ArgumentNullException("identity");
            }
            RequestIndexEntryObjectId requestIndexEntryObjectId = identity as RequestIndexEntryObjectId;

            if (requestIndexEntryObjectId == null)
            {
                throw new ArgumentException("This provider only supports RequestIndexEntryObjectIds", "identity");
            }
            Type typeFromHandle = typeof(T);

            if (!typeFromHandle.IsSubclassOf(typeof(RequestBase)) && !typeof(IRequestIndexEntry).IsAssignableFrom(typeFromHandle))
            {
                throw new ArgumentException("This provider only supports reading types of RequestBase or IRequestIndexEntry");
            }
            IRequestIndexEntry requestIndexEntry = this.Read(requestIndexEntryObjectId);

            if (requestIndexEntry == null || requestIndexEntry is T)
            {
                return(requestIndexEntry);
            }
            if (!typeFromHandle.IsSubclassOf(typeof(RequestBase)))
            {
                return(null);
            }
            return(RequestIndexEntryProvider.CreateRequest <T>(requestIndexEntry));
        }
        internal static void ValidateRequestJob(RequestJobBase requestJob)
        {
            if (requestJob.IsFake || requestJob.WorkItemQueueMdb == null)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMissing);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestNotDeserialized;
                return;
            }
            if (requestJob.OriginatingMDBGuid != Guid.Empty && requestJob.OriginatingMDBGuid != requestJob.WorkItemQueueMdb.ObjectGuid)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestInWrongMDB(requestJob.OriginatingMDBGuid, requestJob.WorkItemQueueMdb.ObjectGuid);
                return;
            }
            if (requestJob.OriginatingMDBGuid == Guid.Empty)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            MailboxRelocationRequestStatistics.LoadAdditionalPropertiesFromUser(requestJob);
            if (MailboxRelocationRequestStatistics.IsTerminalState(requestJob))
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            if (!requestJob.ValidateUser(requestJob.User, requestJob.UserId))
            {
                return;
            }
            Guid guid;
            Guid guid2;

            RequestIndexEntryProvider.GetMoveGuids(requestJob.User, out guid, out guid2);
            if (guid != requestJob.ExchangeGuid)
            {
                MrsTracer.Common.Error("Orphaned RequestJob: mailbox guid does not match between AD {0} and workitem queue {1}.", new object[]
                {
                    requestJob.User.ExchangeGuid,
                    requestJob.ExchangeGuid
                });
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                requestJob.ValidationMessage = MrsStrings.ValidationMailboxGuidsDontMatch(guid, requestJob.ExchangeGuid);
                return;
            }
            if (!MailboxRelocationRequestStatistics.ValidateNoOtherRequests(requestJob))
            {
                return;
            }
            if (CommonUtils.IsImplicitSplit(requestJob.Flags, requestJob.User))
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                requestJob.ValidationMessage = MrsStrings.ErrorImplicitSplit;
                return;
            }
            requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
            requestJob.ValidationMessage = LocalizedString.Empty;
        }
 public ScopeRestorer(RequestIndexEntryProvider owner)
 {
     this.ownerProvider         = owner;
     this.savedRecipSession     = owner.recipSession;
     this.savedConfigSession    = owner.configSession;
     this.savedDomainController = owner.domainController;
     this.savedOrgId            = owner.orgId;
 }
 public IRequestIndexEntry Read(RequestIndexEntryObjectId objectId)
 {
     if (objectId.IndexId.RequestIndexEntryType == null)
     {
         return(null);
     }
     return(RequestIndexEntryProvider.Handle <IRequestIndexEntry>(objectId.IndexId.RequestIndexEntryType, (IRequestIndexEntryHandler handler) => handler.Read(this, objectId)));
 }
 void IRequestIndexEntryHandler.Save(RequestIndexEntryProvider requestIndexEntryProvider, IRequestIndexEntry instance)
 {
     if (instance == null)
     {
         throw new ArgumentNullException("instance");
     }
     this.Save(requestIndexEntryProvider, (T)((object)instance));
 }
        public void Save(IConfigurable instance)
        {
            IRequestIndexEntry requestIndexEntry = RequestIndexEntryProvider.ValidateInstance(instance);

            RequestIndexEntryProvider.Handle(requestIndexEntry.GetType(), delegate(IRequestIndexEntryHandler handler)
            {
                handler.Save(this, requestIndexEntry);
            });
        }
        private static T Handle <T>(Type requestIndexEntryType, Func <IRequestIndexEntryHandler, T> function)
        {
            T returnValue = default(T);

            RequestIndexEntryProvider.Handle(requestIndexEntryType, delegate(IRequestIndexEntryHandler handler)
            {
                returnValue = function(handler);
            });
            return(returnValue);
        }
        IRequestIndexEntry IRequestIndexEntryHandler.Read(RequestIndexEntryProvider requestIndexEntryProvider, RequestIndexEntryObjectId identity)
        {
            Type typeFromHandle = typeof(T);

            if (identity.IndexId.RequestIndexEntryType != typeFromHandle)
            {
                throw new ArgumentException(string.Format("The provided identity is requesting an IRequestIndexEntry of type {0}, but this handler only supports type {1}.", identity.IndexId.RequestIndexEntryType.Name, typeFromHandle.Name), "identity");
            }
            return(this.Read(requestIndexEntryProvider, identity));
        }
 public override void Save(RequestIndexEntryProvider requestIndexEntryProvider, T instance)
 {
     ArgumentValidator.ThrowIfNull("instance", instance);
     ArgumentValidator.ThrowIfNull("instance.TargetUser", instance.TargetUser);
     ArgumentValidator.ThrowIfNull("instance.TargetExchangeGuid", instance.TargetExchangeGuid);
     instance.SetExchangePrincipal();
     using (MailboxSession mailboxSession = MailboxSession.OpenAsAdmin(instance.GetExchangePrincipal(), CultureInfo.InvariantCulture, "Client=MSExchangeMigration"))
     {
         instance.Save(new MailboxStoreTypeProvider(instance.TargetUser)
         {
             MailboxSession = mailboxSession
         });
     }
 }
示例#13
0
        public override IEnumerable <MRSRequestMailboxEntry> FindPaged(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize)
        {
            RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = filter as RequestIndexEntryQueryFilter;
            ADUser aduser = requestIndexEntryProvider.ReadADUser(requestIndexEntryQueryFilter.MailboxId, Guid.Empty);

            if (aduser == null)
            {
                return(null);
            }
            List <MRSRequestMailboxEntry> list = new List <MRSRequestMailboxEntry>(MailboxRequestIndexEntryHandler.GetRequestIndexEntries(aduser, requestIndexEntryQueryFilter));

            foreach (MRSRequestMailboxEntry mrsrequestMailboxEntry in list)
            {
                mrsrequestMailboxEntry.RequestIndexId = new RequestIndexId(requestIndexEntryQueryFilter.MailboxId);
                mrsrequestMailboxEntry.OrganizationId = aduser.OrganizationId;
            }
            return(list);
        }
示例#14
0
        public override void Delete(RequestIndexEntryProvider requestIndexEntryProvider, MRSRequestMailboxEntry instance)
        {
            this.ValidateRequestIndexId(instance.RequestIndexId);
            ADUser aduser = requestIndexEntryProvider.ReadADUser(instance.RequestIndexId.Mailbox, Guid.Empty);

            if (instance.Principal == null)
            {
                instance.Principal = ExchangePrincipal.FromADUser(aduser, RemotingOptions.AllowCrossSite);
            }
            using (MailboxSession mailboxSession = MailboxSession.OpenAsAdmin(instance.Principal, CultureInfo.InvariantCulture, "Client=MSExchangeMigration"))
            {
                MailboxStoreTypeProvider session = new MailboxStoreTypeProvider(aduser)
                {
                    MailboxSession = mailboxSession
                };
                instance.Delete(session);
            }
        }
示例#15
0
        internal IEnumerable <T> InternalGetObjects <T>(ObjectId rootId, IConfigDataProvider session, OptionalIdentityData optionalData, out LocalizedString?notFoundReason) where T : IConfigurable, new()
        {
            if (session == null)
            {
                throw new ArgumentNullException("session");
            }
            RequestIndexEntryProvider requestIndexEntryProvider = session as RequestIndexEntryProvider;

            if (requestIndexEntryProvider == null)
            {
                throw new ArgumentException(MrsStrings.MustProvideValidSessionForFindingRequests);
            }
            if (this.requestGuid != Guid.Empty && this.indexToUse != null)
            {
                List <T> list = new List <T>(1);
                RequestIndexEntryObjectId identity = new RequestIndexEntryObjectId(this.requestGuid, this.RequestType, this.OrganizationId, this.indexToUse, null);
                T t = (T)((object)requestIndexEntryProvider.Read <T>(identity));
                if (t != null)
                {
                    list.Add(t);
                    notFoundReason = null;
                }
                else
                {
                    notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
                }
                return(list);
            }
            if (string.IsNullOrEmpty(this.requestName) || this.indexToUse == null)
            {
                notFoundReason = new LocalizedString?(MrsStrings.NotEnoughInformationSupplied);
                return(new List <T>(0));
            }
            if (this.mailboxId != null)
            {
                QueryFilter filter = new RequestIndexEntryQueryFilter(this.requestName, this.mailboxId, this.RequestType, this.indexToUse, true);
                notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
                return(requestIndexEntryProvider.FindPaged <T>(filter, rootId, true, null, 2));
            }
            QueryFilter filter2 = new RequestIndexEntryQueryFilter(this.requestName, null, this.RequestType, this.indexToUse, false);

            notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
            return(requestIndexEntryProvider.FindPaged <T>(filter2, rootId, true, null, 2));
        }
        public IEnumerable <T> FindPaged <T>(QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize) where T : IConfigurable, new()
        {
            Type requestIndexEntryType = RequestIndexEntryProvider.ValidateQueryFilter <T>(filter);
            IEnumerable <IRequestIndexEntry> enumerable = RequestIndexEntryProvider.Handle <IEnumerable <IRequestIndexEntry> >(requestIndexEntryType, (IRequestIndexEntryHandler handler) => handler.FindPaged(this, filter, rootId, deepSearch, sortBy, pageSize));

            if (enumerable == null)
            {
                return(Array <T> .Empty);
            }
            if (typeof(T).IsSubclassOf(typeof(RequestBase)))
            {
                return(enumerable.Select(new Func <IRequestIndexEntry, T>(RequestIndexEntryProvider.CreateRequest <T>)));
            }
            if (enumerable is IEnumerable <T> )
            {
                return((IEnumerable <T>)enumerable);
            }
            MrsTracer.Common.Warning("IndexId not supported by this provider.", new object[0]);
            return(Array <T> .Empty);
        }
 public static void CreateAndPopulateRequestIndexEntries(RequestJobBase requestJobBase, RequestIndexId requestIndexId)
 {
     if (requestJobBase == null)
     {
         throw new ArgumentNullException("requestJobBase");
     }
     if (requestJobBase.IndexEntries == null)
     {
         requestJobBase.IndexEntries = new List <IRequestIndexEntry>();
     }
     if (requestJobBase.IndexIds == null)
     {
         requestJobBase.IndexIds = new List <RequestIndexId>();
     }
     RequestIndexEntryProvider.Handle(requestIndexId.RequestIndexEntryType, delegate(IRequestIndexEntryHandler handler)
     {
         IRequestIndexEntry item = handler.CreateRequestIndexEntryFromRequestJob(requestJobBase, requestIndexId);
         requestJobBase.IndexIds.Add(requestIndexId);
         requestJobBase.IndexEntries.Add(item);
     });
 }
        public IConfigurable[] Find <T>(QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy) where T : IConfigurable, new()
        {
            Type requestIndexEntryType = RequestIndexEntryProvider.ValidateQueryFilter <T>(filter);

            IRequestIndexEntry[] array = RequestIndexEntryProvider.Handle <IRequestIndexEntry[]>(requestIndexEntryType, (IRequestIndexEntryHandler handler) => handler.Find(this, filter, rootId, deepSearch, sortBy));
            if (array == null)
            {
                return(Array <IConfigurable> .Empty);
            }
            Type typeFromHandle = typeof(T);

            if (array.GetType().GetElementType() == typeFromHandle)
            {
                return(array.Cast <IConfigurable>().ToArray <IConfigurable>());
            }
            if (typeFromHandle.IsSubclassOf(typeof(RequestBase)))
            {
                return(array.Select(new Func <IRequestIndexEntry, T>(RequestIndexEntryProvider.CreateRequest <T>)).Cast <IConfigurable>().ToArray <IConfigurable>());
            }
            MrsTracer.Common.Warning("IndexId not supported by this provider.", new object[0]);
            return(Array <IConfigurable> .Empty);
        }
        public static void CreateAndPopulateRequestIndexEntries(RequestJobBase requestJobBase, IConfigurationSession session)
        {
            if (requestJobBase == null)
            {
                throw new ArgumentNullException("requestJobBase");
            }
            if (requestJobBase.IndexEntries == null)
            {
                requestJobBase.IndexEntries = new List <IRequestIndexEntry>();
            }
            if (requestJobBase.IndexIds == null)
            {
                requestJobBase.IndexIds = new List <RequestIndexId>();
            }
            RequestIndexId indexId = new RequestIndexId(RequestIndexLocation.AD);

            RequestIndexEntryProvider.Handle(indexId.RequestIndexEntryType, delegate(IRequestIndexEntryHandler handler)
            {
                IRequestIndexEntry item = handler.CreateRequestIndexEntryFromRequestJob(requestJobBase, session);
                requestJobBase.IndexIds.Add(indexId);
                requestJobBase.IndexEntries.Add(item);
            });
        }
示例#20
0
 public override void Save(RequestIndexEntryProvider requestIndexEntryProvider, MRSRequestWrapper instance)
 {
     ADHandler.Save(requestIndexEntryProvider.ConfigSession, instance);
 }
示例#21
0
 public override MRSRequestWrapper Read(RequestIndexEntryProvider requestIndexEntryProvider, RequestIndexEntryObjectId identity)
 {
     return(ADHandler.Read(requestIndexEntryProvider.ConfigSession, identity.RequestGuid, identity.RequestType));
 }
示例#22
0
        public override IEnumerable <MRSRequestWrapper> FindPaged(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize)
        {
            QueryFilter filter2 = ADHandler.ConvertFilter(filter);

            return(requestIndexEntryProvider.ConfigSession.FindPaged <MRSRequestWrapper>(filter2, rootId, deepSearch, sortBy, pageSize));
        }
示例#23
0
 public override MRSRequestWrapper[] Find(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy)
 {
     return(ADHandler.Find(requestIndexEntryProvider.ConfigSession, filter, rootId, deepSearch, sortBy));
 }
        internal static void ValidateRequestJob(RequestJobBase requestJob)
        {
            if (requestJob.IsFake || requestJob.WorkItemQueueMdb == null)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMissing);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestNotDeserialized;
                return;
            }
            if (requestJob.OriginatingMDBGuid != Guid.Empty && requestJob.OriginatingMDBGuid != requestJob.WorkItemQueueMdb.ObjectGuid)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestInWrongMDB(requestJob.OriginatingMDBGuid, requestJob.WorkItemQueueMdb.ObjectGuid);
                return;
            }
            if (requestJob.OriginatingMDBGuid == Guid.Empty)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            MoveRequestStatistics.LoadAdditionalPropertiesFromUser(requestJob);
            if (requestJob.CancelRequest || requestJob.Status == RequestStatus.Completed || requestJob.Status == RequestStatus.CompletedWithWarning)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            if (!requestJob.ValidateUser(requestJob.User, requestJob.UserId))
            {
                return;
            }
            Guid guid;
            Guid guid2;

            RequestIndexEntryProvider.GetMoveGuids(requestJob.User, out guid, out guid2);
            if (guid != requestJob.ExchangeGuid)
            {
                MrsTracer.Common.Error("Orphaned RequestJob: mailbox guid does not match between AD {0} and workitem queue {1}.", new object[]
                {
                    requestJob.User.ExchangeGuid,
                    requestJob.ExchangeGuid
                });
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                requestJob.ValidationMessage = MrsStrings.ValidationMailboxGuidsDontMatch(guid, requestJob.ExchangeGuid);
                return;
            }
            if (requestJob.User.MailboxMoveStatus == RequestStatus.None)
            {
                MrsTracer.Common.Warning("Orphaned RequestJob: AD user {0} is not being moved.", new object[]
                {
                    requestJob.User.ToString()
                });
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
                requestJob.ValidationMessage = MrsStrings.ValidationADUserIsNotBeingMoved;
                return;
            }
            if (requestJob.Flags != requestJob.User.MailboxMoveFlags)
            {
                if ((requestJob.Flags & RequestJobBase.StaticFlags) != (requestJob.User.MailboxMoveFlags & RequestJobBase.StaticFlags))
                {
                    MrsTracer.Common.Error("Mismatched RequestJob: flags don't match: AD [{0}], workitem queue [{1}]", new object[]
                    {
                        requestJob.User.MailboxMoveFlags,
                        requestJob.Flags
                    });
                    requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJob.ValidationMessage = MrsStrings.ValidationFlagsMismatch(requestJob.User.MailboxMoveFlags.ToString(), requestJob.Flags.ToString());
                    return;
                }
                MrsTracer.Common.Debug("Possibly mismatched RequestJob: flags don't match: AD [{0}], workitem queue [{1}]", new object[]
                {
                    requestJob.User.MailboxMoveFlags,
                    requestJob.Flags
                });
            }
            if (requestJob.PrimaryIsMoving)
            {
                if (requestJob.SourceIsLocal && (requestJob.SourceDatabase == null || !requestJob.SourceDatabase.Equals(requestJob.User.MailboxMoveSourceMDB)))
                {
                    MrsTracer.Common.Error("Mismatched RequestJob: Source database does not match between AD ({0}) and RequestJob ({1})", new object[]
                    {
                        requestJob.User.MailboxMoveSourceMDB,
                        requestJob.SourceDatabase
                    });
                    requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJob.ValidationMessage = MrsStrings.ValidationSourceMDBMismatch((requestJob.User.MailboxMoveSourceMDB != null) ? requestJob.User.MailboxMoveSourceMDB.ToString() : "(null)", (requestJob.SourceDatabase != null) ? requestJob.SourceDatabase.ToString() : "(null)");
                    return;
                }
                if (requestJob.TargetIsLocal && (requestJob.TargetDatabase == null || (!requestJob.RehomeRequest && !requestJob.TargetDatabase.Equals(requestJob.User.MailboxMoveTargetMDB))))
                {
                    MrsTracer.Common.Error("Target database does not match between AD ({0}) and RequestJob ({1})", new object[]
                    {
                        requestJob.User.MailboxMoveTargetMDB,
                        requestJob.TargetDatabase
                    });
                    requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJob.ValidationMessage = MrsStrings.ValidationTargetMDBMismatch((requestJob.User.MailboxMoveTargetMDB != null) ? requestJob.User.MailboxMoveTargetMDB.ToString() : "(null)", (requestJob.TargetDatabase != null) ? requestJob.TargetDatabase.ToString() : "(null)");
                    return;
                }
            }
            if (requestJob.JobType >= MRSJobType.RequestJobE14R5_PrimaryOrArchiveExclusiveMoves && requestJob.ArchiveIsMoving)
            {
                if (requestJob.SourceIsLocal && (requestJob.SourceArchiveDatabase == null || !requestJob.SourceArchiveDatabase.Equals(requestJob.User.MailboxMoveSourceArchiveMDB)))
                {
                    MrsTracer.Common.Error("Mismatched RequestJob: Source archive database does not match between AD ({0}) and RequestJob ({1})", new object[]
                    {
                        requestJob.User.MailboxMoveSourceArchiveMDB,
                        requestJob.SourceArchiveDatabase
                    });
                    requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJob.ValidationMessage = MrsStrings.ValidationSourceArchiveMDBMismatch((requestJob.User.MailboxMoveSourceArchiveMDB != null) ? requestJob.User.MailboxMoveSourceArchiveMDB.ToString() : "(null)", (requestJob.SourceArchiveDatabase != null) ? requestJob.SourceArchiveDatabase.ToString() : "(null)");
                    return;
                }
                if (requestJob.TargetIsLocal && (requestJob.TargetArchiveDatabase == null || (!requestJob.RehomeRequest && !requestJob.TargetArchiveDatabase.Equals(requestJob.User.MailboxMoveTargetArchiveMDB))))
                {
                    MrsTracer.Common.Error("Target archive database does not match between AD ({0}) and RequestJob ({1})", new object[]
                    {
                        requestJob.User.MailboxMoveTargetArchiveMDB,
                        requestJob.TargetArchiveDatabase
                    });
                    requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJob.ValidationMessage = MrsStrings.ValidationTargetArchiveMDBMismatch((requestJob.User.MailboxMoveTargetArchiveMDB != null) ? requestJob.User.MailboxMoveTargetArchiveMDB.ToString() : "(null)", (requestJob.TargetArchiveDatabase != null) ? requestJob.TargetArchiveDatabase.ToString() : "(null)");
                    return;
                }
            }
            requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
            requestJob.ValidationMessage = LocalizedString.Empty;
        }
 public virtual IEnumerable <T> FindPaged(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize)
 {
     return(Array <T> .Empty);
 }
        string IMailboxReplicationService.ValidateAndPopulateRequestJob(string requestJobXML, out string reportEntryXMLs)
        {
            string reportString = null;
            string resultString = null;

            try
            {
                this.ForwardKnownExceptions(delegate
                {
                    List <ReportEntry> list = new List <ReportEntry>();
                    try
                    {
                        RequestJobXML requestJob = XMLSerializableBase.Deserialize <RequestJobXML>(requestJobXML, true);
                        using (TransactionalRequestJob transactionalRequestJob = new TransactionalRequestJob(requestJob))
                        {
                            transactionalRequestJob.IsFake   = true;
                            transactionalRequestJob.Identity = new RequestJobObjectId((transactionalRequestJob.RequestType == MRSRequestType.Move) ? transactionalRequestJob.ExchangeGuid : transactionalRequestJob.RequestGuid, (transactionalRequestJob.WorkItemQueueMdb == null) ? Guid.Empty : transactionalRequestJob.WorkItemQueueMdb.ObjectGuid, null);
                            RequestIndexEntryProvider requestIndexEntryProvider = new RequestIndexEntryProvider();
                            using (requestIndexEntryProvider.RescopeTo(transactionalRequestJob.DomainControllerToUpdate, transactionalRequestJob.OrganizationId))
                            {
                                if (transactionalRequestJob.SourceUserId != null)
                                {
                                    transactionalRequestJob.SourceUser = requestIndexEntryProvider.ReadADUser(transactionalRequestJob.SourceUserId, transactionalRequestJob.SourceExchangeGuid);
                                }
                                if (transactionalRequestJob.TargetUserId != null)
                                {
                                    transactionalRequestJob.TargetUser = requestIndexEntryProvider.ReadADUser(transactionalRequestJob.TargetUserId, transactionalRequestJob.TargetExchangeGuid);
                                }
                            }
                            if (MailboxSyncerJobs.ContainsJob(transactionalRequestJob.IdentifyingGuid))
                            {
                                resultString = requestJobXML;
                            }
                            else
                            {
                                BaseJob baseJob = MailboxSyncerJobs.ConstructJob(transactionalRequestJob);
                                if (baseJob == null)
                                {
                                    MrsTracer.Service.Error("Don't know how to process '{0}' request", new object[]
                                    {
                                        transactionalRequestJob.RequestType
                                    });
                                    throw new RequestTypeNotUnderstoodPermanentException(CommonUtils.LocalComputerName, VersionInformation.MRS.ToString(), (int)transactionalRequestJob.RequestType);
                                }
                                using (baseJob)
                                {
                                    baseJob.Initialize(transactionalRequestJob);
                                    baseJob.ValidateAndPopulateRequestJob(list);
                                    transactionalRequestJob.Message              = baseJob.CachedRequestJob.Message;
                                    transactionalRequestJob.SourceVersion        = baseJob.CachedRequestJob.SourceVersion;
                                    transactionalRequestJob.SourceArchiveVersion = baseJob.CachedRequestJob.SourceArchiveVersion;
                                    transactionalRequestJob.SourceServer         = baseJob.CachedRequestJob.SourceServer;
                                    transactionalRequestJob.SourceArchiveServer  = baseJob.CachedRequestJob.SourceArchiveServer;
                                    transactionalRequestJob.TargetVersion        = baseJob.CachedRequestJob.TargetVersion;
                                    transactionalRequestJob.TargetArchiveVersion = baseJob.CachedRequestJob.TargetArchiveVersion;
                                    transactionalRequestJob.TargetServer         = baseJob.CachedRequestJob.TargetServer;
                                    transactionalRequestJob.TargetArchiveServer  = baseJob.CachedRequestJob.TargetArchiveServer;
                                    transactionalRequestJob.RemoteDatabaseGuid   = baseJob.CachedRequestJob.RemoteDatabaseGuid;
                                    resultString = XMLSerializableBase.Serialize(new RequestJobXML(transactionalRequestJob), false);
                                }
                            }
                        }
                    }
                    finally
                    {
                        reportString = XMLSerializableBase.Serialize(list, false);
                    }
                }, null);
            }
            finally
            {
                reportEntryXMLs = reportString;
            }
            return(resultString);
        }
 public abstract T Read(RequestIndexEntryProvider requestIndexEntryProvider, RequestIndexEntryObjectId identity);
 public abstract void Save(RequestIndexEntryProvider requestIndexEntryProvider, T instance);
 IRequestIndexEntry[] IRequestIndexEntryHandler.Find(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy)
 {
     return((IRequestIndexEntry[])this.Find(requestIndexEntryProvider, filter, rootId, deepSearch, sortBy));
 }
 IEnumerable <IRequestIndexEntry> IRequestIndexEntryHandler.FindPaged(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize)
 {
     return(this.FindPaged(requestIndexEntryProvider, filter, rootId, deepSearch, sortBy, pageSize));
 }