internal bool AddActiveReplication(Replication replication)
        {
            if (ActiveReplicators == null) {
                Log.W(TAG, "ActiveReplicators is null, so replication will not be added");
                return false;
            }

            if (ActiveReplicators.All(x => x.RemoteCheckpointDocID() != replication.RemoteCheckpointDocID())) {
                ActiveReplicators.Add(replication);
            } else {
                return false;
            }

            replication.Changed += (sender, e) => {
                if (e.Source != null && !e.Source.IsRunning && ActiveReplicators != null)
                {
                    ActiveReplicators.Remove(e.Source);
                }
            };

            return true;
        }
 internal bool HasSameSettingsAs(Replication other)
 {
     return LocalDatabase == other.LocalDatabase &&
     IsPull == other.IsPull &&
     RemoteCheckpointDocID("").Equals(other.RemoteCheckpointDocID(""));
 }
        internal bool AddReplication(Replication replication)
        {
            lock (_allReplicatorsLocker) {
                if (AllReplications.All(x => x.RemoteCheckpointDocID() != replication.RemoteCheckpointDocID())) {
                    AllReplicators.Add(replication);
                    return true;
                }

                return false;

            }
        }
        internal bool AddActiveReplication(Replication replication)
        {
            if(replication == null) {
                return false;
            }

            var activeReplicators = default(IList<Replication>);
            if(!ActiveReplicators.AcquireTemp(out activeReplicators)) {
                Log.To.Database.W(TAG, "{0} ActiveReplicators is null, so replication will not be added");
                return false;
            }

            lock(_activeReplicatorsLocker) {
                if(activeReplicators.All(x => x != null && x.RemoteCheckpointDocID() != replication.RemoteCheckpointDocID())) {
                    activeReplicators.Add(replication);
                } else {
                    return false;
                }
            }
            
            replication.Changed += (sender, e) =>
            {
                if(e.ReplicationStateTransition != null && (e.ReplicationStateTransition.Trigger == ReplicationTrigger.StopGraceful || e.ReplicationStateTransition.Trigger == ReplicationTrigger.StopImmediate)) {
                    if(ActiveReplicators.AcquireTemp(out activeReplicators)) {
                        lock(_activeReplicatorsLocker) {
                            activeReplicators.Remove(e.Source);
                        }
                    }
                }
            };

            return true;
        }