Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / InMemStatusChecker.cs @ 3c43ec9b

History | View | Annotate | Download (5.9 kB)

1 eeee29e3 Panagiotis Kanavos
using System;
2 b5061ac8 Panagiotis Kanavos
using System.Collections.Concurrent;
3 eeee29e3 Panagiotis Kanavos
using System.Collections.Generic;
4 eeee29e3 Panagiotis Kanavos
using System.ComponentModel.Composition;
5 eeee29e3 Panagiotis Kanavos
using System.Diagnostics.Contracts;
6 b5061ac8 Panagiotis Kanavos
using System.Linq;
7 3c43ec9b Panagiotis Kanavos
using System.Threading;
8 eeee29e3 Panagiotis Kanavos
using Pithos.Interfaces;
9 eeee29e3 Panagiotis Kanavos
10 eeee29e3 Panagiotis Kanavos
namespace Pithos.Core
11 eeee29e3 Panagiotis Kanavos
{
12 eeee29e3 Panagiotis Kanavos
    //[Export(typeof(IStatusChecker)),Export(typeof(IStatusKeeper))]
13 eeee29e3 Panagiotis Kanavos
    public class InMemStatusChecker:IStatusChecker,IStatusKeeper
14 eeee29e3 Panagiotis Kanavos
    {
15 eeee29e3 Panagiotis Kanavos
        [Import]
16 eeee29e3 Panagiotis Kanavos
        public IPithosSettings Settings { get; set; }
17 eeee29e3 Panagiotis Kanavos
18 eeee29e3 Panagiotis Kanavos
        private readonly string[] _states = {"Normal", "Modified", "Conflict","Synch"};
19 eeee29e3 Panagiotis Kanavos
20 b5061ac8 Panagiotis Kanavos
        ConcurrentDictionary<string, FileOverlayStatus> _overlayCache = new ConcurrentDictionary<string, FileOverlayStatus>();
21 b5061ac8 Panagiotis Kanavos
        ConcurrentDictionary<string, FileStatus> _statusCache = new ConcurrentDictionary<string, FileStatus>();
22 b5061ac8 Panagiotis Kanavos
        ConcurrentDictionary<string, string> _checksums = new ConcurrentDictionary<string, string>();
23 eeee29e3 Panagiotis Kanavos
24 eeee29e3 Panagiotis Kanavos
        public FileOverlayStatus GetFileOverlayStatus(string path)
25 eeee29e3 Panagiotis Kanavos
        {
26 eeee29e3 Panagiotis Kanavos
            if (!_overlayCache.ContainsKey(path))
27 b5061ac8 Panagiotis Kanavos
                return FileOverlayStatus.Unversioned;
28 eeee29e3 Panagiotis Kanavos
29 eeee29e3 Panagiotis Kanavos
            var pithosPath = Settings.PithosPath;
30 eeee29e3 Panagiotis Kanavos
            if (path.StartsWith(pithosPath,true,null))
31 eeee29e3 Panagiotis Kanavos
            {
32 eeee29e3 Panagiotis Kanavos
                var status = _overlayCache[path];
33 eeee29e3 Panagiotis Kanavos
                return status;
34 eeee29e3 Panagiotis Kanavos
            }
35 b5061ac8 Panagiotis Kanavos
            return FileOverlayStatus.Unversioned;
36 b5061ac8 Panagiotis Kanavos
        }
37 b5061ac8 Panagiotis Kanavos
38 b5061ac8 Panagiotis Kanavos
        public IEnumerable<string> StoreUnversionedFiles(ParallelQuery<string> paths)
39 b5061ac8 Panagiotis Kanavos
        {
40 b5061ac8 Panagiotis Kanavos
41 b5061ac8 Panagiotis Kanavos
            var newFiles = (from file in paths
42 b5061ac8 Panagiotis Kanavos
                            where !_overlayCache.ContainsKey(file)
43 b5061ac8 Panagiotis Kanavos
                            select new {
44 b5061ac8 Panagiotis Kanavos
                                           FilePath = file,
45 b5061ac8 Panagiotis Kanavos
                                           OverlayStatus = FileOverlayStatus.Unversioned,
46 b5061ac8 Panagiotis Kanavos
                                           FileStatus = FileStatus.Created,
47 b5061ac8 Panagiotis Kanavos
                                           Checksum = Signature.CalculateHash(file)
48 b5061ac8 Panagiotis Kanavos
                                       });
49 b5061ac8 Panagiotis Kanavos
            ConcurrentBag<string> files = new ConcurrentBag<string>();           
50 b5061ac8 Panagiotis Kanavos
            newFiles.ForAll(state =>
51 b5061ac8 Panagiotis Kanavos
                                {
52 b5061ac8 Panagiotis Kanavos
                                    _overlayCache[state.FilePath] = state.OverlayStatus;
53 b5061ac8 Panagiotis Kanavos
                                    _statusCache[state.FilePath] = state.FileStatus;
54 b5061ac8 Panagiotis Kanavos
                                    _checksums[state.FilePath] = state.Checksum;
55 b5061ac8 Panagiotis Kanavos
                                    files.Add(state.FilePath);
56 b5061ac8 Panagiotis Kanavos
                                });
57 b5061ac8 Panagiotis Kanavos
            return files.GetConsumingEnumerable();
58 eeee29e3 Panagiotis Kanavos
        }
59 eeee29e3 Panagiotis Kanavos
60 0eea575a Panagiotis Kanavos
        public void Stop()
61 0eea575a Panagiotis Kanavos
        {
62 0eea575a Panagiotis Kanavos
            
63 0eea575a Panagiotis Kanavos
        }
64 0eea575a Panagiotis Kanavos
65 5bcf6d70 Panagiotis Kanavos
66 5bcf6d70 Panagiotis Kanavos
        private PithosStatus _pithosStatus = PithosStatus.InSynch;
67 5bcf6d70 Panagiotis Kanavos
        public void SetPithosStatus(PithosStatus status)
68 5bcf6d70 Panagiotis Kanavos
        {
69 5bcf6d70 Panagiotis Kanavos
            _pithosStatus = status;
70 5bcf6d70 Panagiotis Kanavos
        }
71 5bcf6d70 Panagiotis Kanavos
72 eeee29e3 Panagiotis Kanavos
        public PithosStatus GetPithosStatus()
73 eeee29e3 Panagiotis Kanavos
        {
74 5bcf6d70 Panagiotis Kanavos
            return _pithosStatus;
75 eeee29e3 Panagiotis Kanavos
        }
76 eeee29e3 Panagiotis Kanavos
77 283809f3 Panagiotis Kanavos
    public void SetStatus(string path, Action<FileState> setter)
78 283809f3 Panagiotis Kanavos
        {
79 283809f3 Panagiotis Kanavos
            throw new NotImplementedException();
80 283809f3 Panagiotis Kanavos
        }
81 283809f3 Panagiotis Kanavos
82 283809f3 Panagiotis Kanavos
        ConcurrentDictionary<string, NetworkState> _networkState = new ConcurrentDictionary<string, NetworkState>();
83 283809f3 Panagiotis Kanavos
84 283809f3 Panagiotis Kanavos
    
85 283809f3 Panagiotis Kanavos
        public void SetNetworkState(string path, NetworkState state)
86 283809f3 Panagiotis Kanavos
        {
87 283809f3 Panagiotis Kanavos
            _networkState[path.ToLower()] = state;
88 283809f3 Panagiotis Kanavos
            //Removing may fail so we store the "None" value anyway
89 283809f3 Panagiotis Kanavos
            if (state == NetworkState.None)
90 283809f3 Panagiotis Kanavos
            {
91 283809f3 Panagiotis Kanavos
                NetworkState oldState;
92 283809f3 Panagiotis Kanavos
                _networkState.TryRemove(path, out oldState);
93 283809f3 Panagiotis Kanavos
            }
94 283809f3 Panagiotis Kanavos
        }
95 283809f3 Panagiotis Kanavos
96 283809f3 Panagiotis Kanavos
        public NetworkState GetNetworkState(string path)
97 283809f3 Panagiotis Kanavos
        {
98 283809f3 Panagiotis Kanavos
            NetworkState state;
99 283809f3 Panagiotis Kanavos
            if (_networkState.TryGetValue(path, out state))
100 283809f3 Panagiotis Kanavos
                return state;
101 283809f3 Panagiotis Kanavos
            return NetworkState.None;
102 283809f3 Panagiotis Kanavos
        }
103 283809f3 Panagiotis Kanavos
104 3c43ec9b Panagiotis Kanavos
        public void StartProcessing(CancellationToken token)
105 3c43ec9b Panagiotis Kanavos
        {
106 3c43ec9b Panagiotis Kanavos
            
107 3c43ec9b Panagiotis Kanavos
        }
108 3c43ec9b Panagiotis Kanavos
109 eeee29e3 Panagiotis Kanavos
        public void SetFileOverlayStatus(string path, FileOverlayStatus overlayStatus)
110 eeee29e3 Panagiotis Kanavos
        {
111 eeee29e3 Panagiotis Kanavos
            _overlayCache[path] = overlayStatus;
112 eeee29e3 Panagiotis Kanavos
        }
113 eeee29e3 Panagiotis Kanavos
114 eeee29e3 Panagiotis Kanavos
        public void RemoveFileOverlayStatus(string path)
115 eeee29e3 Panagiotis Kanavos
        {
116 b5061ac8 Panagiotis Kanavos
            FileOverlayStatus value;
117 b5061ac8 Panagiotis Kanavos
            _overlayCache.TryRemove(path, out value);
118 eeee29e3 Panagiotis Kanavos
        }
119 eeee29e3 Panagiotis Kanavos
120 eeee29e3 Panagiotis Kanavos
        public void RenameFileOverlayStatus(string oldPath, string newPath)
121 eeee29e3 Panagiotis Kanavos
        {
122 eeee29e3 Panagiotis Kanavos
            var status=_overlayCache[oldPath];
123 b5061ac8 Panagiotis Kanavos
            _overlayCache[newPath] = status;
124 b5061ac8 Panagiotis Kanavos
            FileOverlayStatus value;
125 b5061ac8 Panagiotis Kanavos
            _overlayCache.TryRemove(oldPath,out value);
126 eeee29e3 Panagiotis Kanavos
        }
127 eeee29e3 Panagiotis Kanavos
128 eeee29e3 Panagiotis Kanavos
        public void SetFileStatus(string path, FileStatus status)
129 eeee29e3 Panagiotis Kanavos
        {
130 eeee29e3 Panagiotis Kanavos
            _statusCache[path] = status;
131 eeee29e3 Panagiotis Kanavos
        }
132 eeee29e3 Panagiotis Kanavos
133 283809f3 Panagiotis Kanavos
        public void SetFileState(string path, FileStatus fileStatus, FileOverlayStatus overlayStatus)
134 283809f3 Panagiotis Kanavos
        {
135 283809f3 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
136 283809f3 Panagiotis Kanavos
                throw new ArgumentNullException("path","path can't be empty");
137 283809f3 Panagiotis Kanavos
            _statusCache[path] = fileStatus;
138 283809f3 Panagiotis Kanavos
            _overlayCache[path] = overlayStatus;
139 283809f3 Panagiotis Kanavos
        }
140 283809f3 Panagiotis Kanavos
141 283809f3 Panagiotis Kanavos
        public void StoreInfo(string path, ObjectInfo objectInfo)
142 283809f3 Panagiotis Kanavos
        {
143 283809f3 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
144 283809f3 Panagiotis Kanavos
                throw new ArgumentNullException("path", "path can't be empty");
145 283809f3 Panagiotis Kanavos
            if (objectInfo == null)
146 283809f3 Panagiotis Kanavos
                throw new ArgumentNullException("objectInfo", "objectInfo can't be empty");
147 283809f3 Panagiotis Kanavos
148 283809f3 Panagiotis Kanavos
            _statusCache[path] = FileStatus.Unchanged;
149 283809f3 Panagiotis Kanavos
            _overlayCache[path] = FileOverlayStatus.Normal;
150 283809f3 Panagiotis Kanavos
            _checksums[path] = objectInfo.Hash;
151 283809f3 Panagiotis Kanavos
152 283809f3 Panagiotis Kanavos
153 283809f3 Panagiotis Kanavos
        }
154 283809f3 Panagiotis Kanavos
155 283809f3 Panagiotis Kanavos
        public T GetStatus<T>(string path, Func<FileState, T> getter, T defaultValue)
156 283809f3 Panagiotis Kanavos
        {
157 283809f3 Panagiotis Kanavos
            throw new NotImplementedException();
158 283809f3 Panagiotis Kanavos
        }
159 283809f3 Panagiotis Kanavos
160 eeee29e3 Panagiotis Kanavos
        public FileStatus GetFileStatus(string path)
161 eeee29e3 Panagiotis Kanavos
        {
162 eeee29e3 Panagiotis Kanavos
            if (!_statusCache.ContainsKey(path))
163 eeee29e3 Panagiotis Kanavos
                return FileStatus.Missing;
164 eeee29e3 Panagiotis Kanavos
            return _statusCache[path];
165 eeee29e3 Panagiotis Kanavos
        }
166 eeee29e3 Panagiotis Kanavos
167 eeee29e3 Panagiotis Kanavos
        public void ClearFileStatus(string path)
168 eeee29e3 Panagiotis Kanavos
        {
169 b5061ac8 Panagiotis Kanavos
            FileStatus value;
170 b5061ac8 Panagiotis Kanavos
            _statusCache.TryRemove(path,out value);
171 eeee29e3 Panagiotis Kanavos
        }
172 eeee29e3 Panagiotis Kanavos
173 eeee29e3 Panagiotis Kanavos
        public void UpdateFileChecksum(string path, string checksum)
174 eeee29e3 Panagiotis Kanavos
        {
175 eeee29e3 Panagiotis Kanavos
            _checksums[path] = checksum;
176 eeee29e3 Panagiotis Kanavos
        }
177 eeee29e3 Panagiotis Kanavos
    }
178 eeee29e3 Panagiotis Kanavos
}