예제 #1
0
 private bool ProcessResponse(MailboxAssociationEwsBinding ewsBinding, UpdateMailboxAssociationResponseType response, MailboxAssociation association, IMailboxLocator mailboxLocator)
 {
     if (response != null && response.ResponseMessages != null && response.ResponseMessages.Items != null && response.ResponseMessages.Items.Length > 0)
     {
         foreach (ResponseMessageType responseMessageType in response.ResponseMessages.Items)
         {
             if (responseMessageType.ResponseClass == ResponseClassType.Success)
             {
                 InProcessAssociationReplicator.Tracer.TraceDebug <MailboxAssociation>((long)this.GetHashCode(), "ReplicateAssociation succeeded. Association {0}", association);
                 this.ProcessSuccess(association, InProcessAssociationReplicator.GetEwsVersionNumber(ewsBinding), mailboxLocator);
                 return(true);
             }
             string failureDescription = string.Format(CultureInfo.InvariantCulture, "ReplicateAssociation Failed. Association {0}. ResponseClass={1}, ResponseCode={2}, MessageText={3}", new object[]
             {
                 association,
                 responseMessageType.ResponseClass,
                 responseMessageType.ResponseCode,
                 responseMessageType.MessageText
             });
             this.ProcessFailure(association, failureDescription);
         }
     }
     else
     {
         string failureDescription2 = string.Format(CultureInfo.InvariantCulture, "ReplicateAssociation Failed with empty response. Association {0}.", new object[]
         {
             association
         });
         this.ProcessFailure(association, failureDescription2);
     }
     return(false);
 }
예제 #2
0
 private void ProcessFailure(MailboxAssociation association, string failureDescription)
 {
     association.LastSyncError = failureDescription;
     association.SyncAttempts++;
     if (InProcessAssociationReplicator.ShouldStopReplicatingAssociation(association))
     {
         this.Logger.LogEvent(new SchemaBasedLogEvent <MailboxAssociationLogSchema.CommandExecution>
         {
             {
                 MailboxAssociationLogSchema.CommandExecution.Command,
                 "InProcessAssociationReplicator.Poison"
             },
             {
                 MailboxAssociationLogSchema.CommandExecution.GroupMailbox,
                 association.Group
             },
             {
                 MailboxAssociationLogSchema.CommandExecution.UserMailboxes,
                 association.User
             }
         });
         association.SyncedVersion = int.MaxValue;
     }
     this.PerformanceTracker.IncrementFailedAssociationReplications();
     this.LogError(failureDescription);
 }
예제 #3
0
 internal static UpdateMailboxAssociationType CreateUpdateMailboxAssociationType(IMailboxLocator master, MailboxAssociation association)
 {
     ArgumentValidator.ThrowIfNull("association", association);
     return(new UpdateMailboxAssociationType
     {
         Master = InProcessAssociationReplicator.CreateMasterMailboxData(master),
         Association = EwsAssociationDataConverter.Convert(association)
     });
 }
 private void ReplicateOutOfSyncAssociation(Func <IAssociationStore, IAssociationAdaptor> associationAdaptorCreator, IMailboxLocator masterLocator, params IMailboxLocator[] slaveLocators)
 {
     ArgumentValidator.ThrowIfNull("masterLocator", masterLocator);
     ArgumentValidator.ThrowIfNull("slaveLocators", slaveLocators);
     ArgumentValidator.ThrowIfZeroOrNegative("slaveLocators.Length", slaveLocators.Length);
     GroupMailboxAccessLayer.Tracer.TraceDebug <IMailboxLocator, int>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Replicating data from mailbox: {0}. Number of out of sync mailboxes: {1}", masterLocator, slaveLocators.Length);
     using (IAssociationStore associationStore = this.storeProviderBuilder.Create(masterLocator, this.PerformanceTracker))
     {
         IAssociationAdaptor              associationAdaptor = associationAdaptorCreator(associationStore);
         InProcessAssociationReplicator   replicator         = new InProcessAssociationReplicator(this.Logger, this.PerformanceTracker, OpenAsAdminOrSystemServiceBudgetTypeType.RunAsBackgroundLoad);
         ICollection <MailboxAssociation> associations       = slaveLocators.Select(new Func <IMailboxLocator, MailboxAssociation>(associationAdaptor.GetAssociation));
         this.ReplicateAssociations(replicator, associationAdaptor, associations);
     }
 }
        private bool ReplicateAssociations(InProcessAssociationReplicator replicator, IAssociationAdaptor associationAdaptor, IEnumerable <MailboxAssociation> associations)
        {
            ArgumentValidator.ThrowIfNull("replicator", replicator);
            ArgumentValidator.ThrowIfNull("associationAdaptor", associationAdaptor);
            ArgumentValidator.ThrowIfNull("associations", associations);
            bool flag = true;

            foreach (MailboxAssociation mailboxAssociation in associations)
            {
                GroupMailboxAccessLayer.Tracer.TraceDebug <MailboxAssociation>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateAssociations. Replicating association {0}", mailboxAssociation);
                flag &= replicator.ReplicateAssociation(associationAdaptor, new MailboxAssociation[]
                {
                    mailboxAssociation
                });
            }
            return(flag);
        }
 private void ReplicateOutOfSyncAssociation(Func <IAssociationStore, IAssociationAdaptor> associationAdaptorCreator, IMailboxLocator masterLocator)
 {
     ArgumentValidator.ThrowIfNull("masterLocator", masterLocator);
     GroupMailboxAccessLayer.Tracer.TraceDebug <IMailboxLocator>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Replicating data from mailbox: {0}.", masterLocator);
     using (IAssociationStore storeProvider = this.storeProviderBuilder.Create(masterLocator, this.PerformanceTracker))
     {
         IAssociationAdaptor              associationAdaptor = associationAdaptorCreator(storeProvider);
         InProcessAssociationReplicator   replicator         = new InProcessAssociationReplicator(this.Logger, this.PerformanceTracker, OpenAsAdminOrSystemServiceBudgetTypeType.RunAsBackgroundLoad);
         IEnumerable <MailboxAssociation> associations       = from association in associationAdaptor.GetAllAssociations()
                                                               where association.IsOutOfSync(storeProvider.MailboxLocator.IdentityHash)
                                                               select association;
         if (this.ReplicateAssociations(replicator, associationAdaptor, associations))
         {
             GroupMailboxAccessLayer.Tracer.TraceDebug((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. All replication succeeded. Clearing mailbox flags");
             ExDateTime nextReplicationTime = ExDateTime.UtcNow.Add(GroupMailboxAccessLayer.TimeBetweenMailboxReplicationProcessing);
             storeProvider.SaveMailboxSyncStatus(nextReplicationTime);
         }
         else
         {
             GroupMailboxAccessLayer.Tracer.TraceError((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Not all replication succeeded. Keeping out of sync flags.");
         }
     }
 }
예제 #7
0
        private bool ExecuteReplicationToMailbox(IAssociationAdaptor masterAdaptor, MailboxAssociation association)
        {
            bool      replicationSucceeded = false;
            Exception exception            = null;

            try
            {
                GrayException.MapAndReportGrayExceptions(delegate()
                {
                    try
                    {
                        MailboxAssociationEwsBinding.ExecuteEwsOperationWithRetry("ReplicateAssociation", delegate
                        {
                            using (MailboxAssociationEwsBinding mailboxAssociationEwsBinding = this.CreateMailboxAssociationEwsBinding(masterAdaptor.MasterLocator, association))
                            {
                                UpdateMailboxAssociationType updateMailboxAssociation = InProcessAssociationReplicator.CreateUpdateMailboxAssociationType(masterAdaptor.MasterLocator, association);
                                UpdateMailboxAssociationResponseType response         = mailboxAssociationEwsBinding.UpdateMailboxAssociation(updateMailboxAssociation);
                                replicationSucceeded = this.ProcessResponse(mailboxAssociationEwsBinding, response, association, masterAdaptor.AssociationStore.MailboxLocator);
                            }
                        });
                    }
                    catch (MailboxNotFoundException exception4)
                    {
                        replicationSucceeded = this.DeleteMailboxNotFoundAssociation(association, masterAdaptor, exception4);
                        if (!replicationSucceeded)
                        {
                            exception = exception4;
                        }
                    }
                    catch (BackEndLocatorException exception5)
                    {
                        exception = exception5;
                    }
                    catch (WebException exception6)
                    {
                        exception = exception6;
                    }
                    catch (InvalidOperationException exception7)
                    {
                        exception = exception7;
                    }
                    catch (LogonAsNetworkServiceException exception8)
                    {
                        if (!ExEnvironment.IsTest)
                        {
                            throw;
                        }
                        exception = exception8;
                    }
                });
            }
            catch (GrayException exception)
            {
                GrayException exception9;
                exception = exception9;
            }
            catch (SoapException exception2)
            {
                exception = exception2;
            }
            catch (IOException exception3)
            {
                exception = exception3;
            }
            if (exception != null)
            {
                this.ProcessFailure(association, exception.ToString());
                replicationSucceeded = false;
            }
            return(replicationSucceeded);
        }