private bool TryGetSlaveEntry(SynchronizationEntry masterEntry, out SynchronizationEntry slaveEntry)
        {
            if (!_map.ContainsKey(_master, masterEntry.Status))
            {
                slaveEntry = null;
                return(false);
            }


            var slaveStatus = _map.GetMappedValue(_master, masterEntry.Status);

            slaveEntry = new SynchronizationEntry(masterEntry.Id, slaveStatus, masterEntry.Properties)
            {
                Ordinal = masterEntry.Ordinal, TimeStamp = masterEntry.TimeStamp
            };
            return(true);
        }
        private Dictionary <string, string> MapProperties(ISynchronizationAgent agent, Dictionary <string, string> properties)
        {
            var mappedProperties = new Dictionary <string, string>();

            foreach (var keyValue in properties)
            {
                if (_propertyMap.ContainsKey(agent, keyValue.Key))
                {
                    mappedProperties.Add(_propertyMap.GetMappedValue(agent, keyValue.Key), keyValue.Value);
                }
            }

            return(mappedProperties);
        }
        public void Synchronize()
        {
            var masterEntries = _master.GetAll();
            var slaveEntries  = _slave.GetAll();

            var idsForDeletion =
                slaveEntries.Select(e => e.Id).Except(
                    masterEntries.Where(me => _map.ContainsKey(_master, me.Status)).Select(e => e.Id));

            foreach (var id in idsForDeletion)
            {
                var entry = slaveEntries.Where(e => e.Id == id).Single();
                _slave.Delete(entry);
            }

            var idsForCreation = masterEntries.Select(e => e.Id).Except(slaveEntries.Select(e => e.Id));

            foreach (var id in idsForCreation)
            {
                try
                {
                    var entry = masterEntries.Where(e => e.Id == id).Single();

                    SynchronizationEntry slaveEntry;

                    if (TryGetSlaveEntry(entry, out slaveEntry))
                    {
                        _slave.Create(slaveEntry);
                    }
                }
                catch (InvalidOperationException e)
                {
                    throw new InvalidOperationException("Id='" + id + "'", e);
                }
            }
        }