Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / Agents / SnapshotDifferencer.cs @ 7f0e1c1e

History | View | Annotate | Download (3.5 kB)

1
// -----------------------------------------------------------------------
2
// <copyright file="SnapshotDifferencer.cs" company="Microsoft">
3
// TODO: Update copyright text.
4
// </copyright>
5
// -----------------------------------------------------------------------
6

    
7
using System.Collections.Concurrent;
8
using Pithos.Interfaces;
9
using Pithos.Network;
10

    
11
namespace Pithos.Core.Agents
12
{
13
    using System;
14
    using System.Collections.Generic;
15
    using System.Linq;
16
    using System.Text;
17

    
18
    /// <summary>
19
    /// TODO: Update summary.
20
    /// </summary>
21
    public class SnapshotDifferencer
22
    {
23
        private IEnumerable<ObjectInfo> _previous;
24
        private IEnumerable<ObjectInfo> _current;
25
        private static ObjectInfo[] _empty = new ObjectInfo[0];
26
        private ObjectInfoComparer _comparer = new ObjectInfoComparer();
27

    
28
        public SnapshotDifferencer()
29
        {
30
            _previous = new List<ObjectInfo>();
31
            _current= new List<ObjectInfo>();
32
        }
33

    
34

    
35
        public SnapshotDifferencer(IEnumerable<ObjectInfo> previous,IEnumerable<ObjectInfo> current  )
36
        {
37
            _previous = previous ?? new List<ObjectInfo>();
38
            _current= current ?? new List<ObjectInfo>();
39
        }
40
        public SnapshotDifferencer Post(IEnumerable<ObjectInfo> list)
41
        {
42
            _previous = _current;
43
            _current = list ?? new List<ObjectInfo>();
44
            return this;
45
        }
46
        
47
        public IEnumerable<ObjectInfo> Deleted
48
        {
49
            get { return _previous.Except(_current,_comparer); }
50
        }
51
        public IEnumerable<ObjectInfo> Created
52
        {
53
            get { return _current.Except(_previous,_comparer); }
54
        }
55
        public IEnumerable<ObjectInfo> Changed
56
        {
57
            get
58
            {
59
                var changes = from newItem in _current 
60
                              let oldItem=_previous.FirstOrDefault(old=>_comparer.Equals(old,newItem))
61
                              where oldItem !=null &&
62
                                    newItem.Hash != oldItem.Hash
63
                              select newItem;
64
                return changes;
65
            }
66
        }
67
        public IEnumerable<ObjectInfo> Unchanged
68
        {
69
            get
70
            {
71
                var unChanged = from newItem in _current
72
                              let oldItem = _previous.FirstOrDefault(old => _comparer.Equals(old, newItem))
73
                              where oldItem != null &&
74
                                    newItem.Hash == oldItem.Hash
75
                              select newItem;
76
                return unChanged;
77
            }
78
        }
79
    }
80

    
81
    public class AccountsDifferencer
82
    {
83
        ConcurrentDictionary<string, SnapshotDifferencer> _differencers = new ConcurrentDictionary<string, SnapshotDifferencer>();
84

    
85
        public ConcurrentDictionary<string, SnapshotDifferencer> Differencers { get { return _differencers; } }
86

    
87
        public SnapshotDifferencer PostSnapshot(AccountInfo accountInfo, List<ObjectInfo> cleanRemotes)
88
        {
89
            SnapshotDifferencer differencer;
90
            if (!_differencers.TryGetValue(accountInfo.UserName, out differencer))
91
            {
92
                differencer = new SnapshotDifferencer();
93
                _differencers[accountInfo.UserName] = differencer;
94
            }
95
            differencer.Post(cleanRemotes);
96
            return differencer;
97
        }
98

    
99
    }
100
}