public void Create(SynchronizationEntry entry)
        {
            var workItem = CreateWorkItem(entry);

            _repository.PostWorkItem(workItem.MoveTo(_beginStep,DateTime.Now));

            _repository.PostWorkItem(workItem);
        }
        private static WorkItem CreateWorkItem(SynchronizationEntry entry)
        {
            var workItem = WorkItem.New(entry.Id, entry.Status);

            if(entry.Ordinal.HasValue)
            {
                workItem = workItem.UpdateOrdinal(entry.Ordinal.Value);
            }

            return workItem.UpdateProperties(entry.Properties);
        }
        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;
        }
        public void UpdateData(SynchronizationEntry entry)
        {
            var unid = entry.Properties["unid"];

            foreach (var keyValue in entry.Properties)
            {
                if(keyValue.Key=="unid")
                {
                    continue;
                }

                _dominoRepository.UpdateField(unid,keyValue.Key,keyValue.Value);
            }
        }
        private bool TryGetSlaveEntry(SynchronizationEntry masterEntry, out SynchronizationEntry slaveEntry)
        {
            slaveEntry = null;

            if(!_map.ContainsKey(_master, masterEntry.Status))
            {
                return false;
            }

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

            slaveEntry = new SynchronizationEntry(masterEntry.Id, slaveStatus, new Dictionary<string, string>());

            return true;
        }
        private bool TryGetSlaveEntry(SynchronizationEntry masterEntry, out SynchronizationEntry slaveEntry)
        {
            slaveEntry = null;

            if (!_map.ContainsKey(_master, masterEntry.Status))
            {
                return(false);
            }

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

            slaveEntry = new SynchronizationEntry(masterEntry.Id, slaveStatus, new Dictionary <string, string>());

            return(true);
        }
        public void Synchronize()
        {
            var masterEntries = _master.GetAll().ToDictionary(e => e.Id);
            var slaveEntries  = _slave.GetAll().ToDictionary(e => e.Id);

            foreach (var masterId in masterEntries.Keys)
            {
                if (!slaveEntries.ContainsKey(masterId))
                {
                    continue;
                }

                var slaveEntry  = slaveEntries[masterId];
                var masterEntry = masterEntries[masterId];

                var slaveProperties             = FilterForSynchronization(_slave, slaveEntry.Properties);
                var slaveMappedMasterProperties = FilterForSynchronization(_slave, MapProperties(_master, masterEntry.Properties));

                SynchronizationEntry updateEntry = null;

                if (!AreEqual(slaveMappedMasterProperties, slaveProperties))
                {
                    Console.WriteLine("Properties differ");
                    Console.WriteLine("Slavemapped master:" + slaveMappedMasterProperties.Select(kv => kv.Value).Join(','));
                    Console.WriteLine("Slave             :" + slaveProperties.Select(kv => kv.Value).Join(','));


                    updateEntry = new SynchronizationEntry(masterId, slaveEntry.Status, slaveMappedMasterProperties)
                    {
                        Ordinal = slaveEntry.Ordinal
                    };
                }

                if (SynchronizeOrdinal && masterEntry.Ordinal != slaveEntry.Ordinal)
                {
                    Console.WriteLine("Ordinals differ: {0}-{1}", masterEntry, slaveEntry);
                    updateEntry = new SynchronizationEntry(masterId, slaveEntry.Status, slaveMappedMasterProperties)
                    {
                        Ordinal = masterEntry.Ordinal
                    };
                }

                if (updateEntry != null)
                {
                    _slave.UpdateData(updateEntry);
                }
            }
        }
        private bool TryGetMasterEntry(SynchronizationEntry slaveEntry, out SynchronizationEntry masterEntry)
        {
            if (!_map.ContainsKey(_slave, slaveEntry.Status))
            {
                masterEntry = null;
                return(false);
            }

            var masterStatus = _map.GetMappedValue(_slave, slaveEntry.Status);

            masterEntry = new SynchronizationEntry(slaveEntry.Id, masterStatus, slaveEntry.Properties)
            {
                Ordinal = slaveEntry.Ordinal, TimeStamp = slaveEntry.TimeStamp
            };
            return(true);
        }
        public void Synchronize()
        {
            var masterEntries = _master.GetAll().ToDictionary(e => e.Id);
            var slaveEntries = _slave.GetAll().ToDictionary(e => e.Id);

            foreach (var masterId in masterEntries.Keys)
            {
                if (!slaveEntries.ContainsKey(masterId))
                {
                    continue;
                }

                var slaveEntry = slaveEntries[masterId];
                var masterEntry = masterEntries[masterId];

                var slaveProperties = FilterForSynchronization(_slave, slaveEntry.Properties);
                var slaveMappedMasterProperties = FilterForSynchronization(_slave, MapProperties(_master, masterEntry.Properties));

                SynchronizationEntry updateEntry = null;

                if (!AreEqual(slaveMappedMasterProperties, slaveProperties))
                {
                    Console.WriteLine("Properties differ");
                    Console.WriteLine("Slavemapped master:"+ slaveMappedMasterProperties.Select(kv => kv.Value).Join(','));
                    Console.WriteLine("Slave             :" + slaveProperties.Select(kv => kv.Value).Join(','));

                    updateEntry = new SynchronizationEntry(masterId, slaveEntry.Status, slaveMappedMasterProperties) {Ordinal = slaveEntry.Ordinal};
                }

                if (SynchronizeOrdinal && masterEntry.Ordinal != slaveEntry.Ordinal)
                {
                    Console.WriteLine("Ordinals differ: {0}-{1}",masterEntry,slaveEntry);
                    updateEntry = new SynchronizationEntry(masterId, slaveEntry.Status, slaveMappedMasterProperties)
                                      {Ordinal = masterEntry.Ordinal};
                }

                if (updateEntry != null)
                {
                    _slave.UpdateData(updateEntry);
                }
            }
        }
 protected static SynchronizationEntry Entry(string id, string status, int? ordinal)
 {
     var entry = new SynchronizationEntry(id, status, new Dictionary<string, string>()) { Ordinal = ordinal };
     return entry;
 }
        public void UpdateStatus(SynchronizationEntry entry)
        {
            var unid = entry.Properties["unid"];

            _dominoRepository.UpdateField(unid,"Status",entry.Status);
        }
 public void Delete(SynchronizationEntry entry)
 {
     throw new NotImplementedException();
 }
        public void UpdateStatus(SynchronizationEntry entry)
        {
            var workItem = WorkItem.New(entry.Id, entry.Status);

            _repository.PostWorkItem(workItem);
        }
        public void UpdateData(SynchronizationEntry entry)
        {
            var workItem = CreateWorkItem(entry);

            _repository.PostWorkItem(workItem);
        }
        public void Delete(SynchronizationEntry entry)
        {
            var workItem = WorkItem.New(entry.Id,entry.Status);

            _repository.DeleteWorkItem(workItem);
        }