root / trunk / Pithos.Core / Agents / FileEventIdleBatch.cs @ dccd340f
History | View | Annotate | Download (5.7 kB)
1 | 79f92570 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 79f92570 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 79f92570 | Panagiotis Kanavos | * <copyright file="FileEventIdleBatch.cs" company="GRNet"> |
4 | 79f92570 | Panagiotis Kanavos | * |
5 | 79f92570 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 79f92570 | Panagiotis Kanavos | * |
7 | 79f92570 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 79f92570 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 79f92570 | Panagiotis Kanavos | * conditions are met: |
10 | 79f92570 | Panagiotis Kanavos | * |
11 | 79f92570 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 79f92570 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 79f92570 | Panagiotis Kanavos | * disclaimer. |
14 | 79f92570 | Panagiotis Kanavos | * |
15 | 79f92570 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 79f92570 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 79f92570 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 79f92570 | Panagiotis Kanavos | * provided with the distribution. |
19 | 79f92570 | Panagiotis Kanavos | * |
20 | 79f92570 | Panagiotis Kanavos | * |
21 | 79f92570 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 79f92570 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 79f92570 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 79f92570 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 79f92570 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 79f92570 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 79f92570 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 79f92570 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 79f92570 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 79f92570 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 79f92570 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 79f92570 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 79f92570 | Panagiotis Kanavos | * |
34 | 79f92570 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 79f92570 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 79f92570 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 79f92570 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 79f92570 | Panagiotis Kanavos | * </copyright> |
39 | 79f92570 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 79f92570 | Panagiotis Kanavos | */ |
41 | 79f92570 | Panagiotis Kanavos | #endregion |
42 | 79f92570 | Panagiotis Kanavos | using System; |
43 | 79f92570 | Panagiotis Kanavos | using System.Collections.Generic; |
44 | 79f92570 | Panagiotis Kanavos | using System.IO; |
45 | 79f92570 | Panagiotis Kanavos | using System.Linq; |
46 | 79f92570 | Panagiotis Kanavos | using System.Reflection; |
47 | 79f92570 | Panagiotis Kanavos | using log4net; |
48 | 79f92570 | Panagiotis Kanavos | |
49 | 79f92570 | Panagiotis Kanavos | namespace Pithos.Core.Agents |
50 | 79f92570 | Panagiotis Kanavos | { |
51 | 79f92570 | Panagiotis Kanavos | public class FileEventIdleBatch |
52 | 79f92570 | Panagiotis Kanavos | { |
53 | 79f92570 | Panagiotis Kanavos | |
54 | 79f92570 | Panagiotis Kanavos | //Requirements |
55 | 79f92570 | Panagiotis Kanavos | //------------ |
56 | 79f92570 | Panagiotis Kanavos | //* The class should group workflow actions according to file name and type |
57 | 79f92570 | Panagiotis Kanavos | //* The class should pass all batched actions to a continuation when |
58 | 79f92570 | Panagiotis Kanavos | //* the batch is triggered. |
59 | 79f92570 | Panagiotis Kanavos | //* Actions should not survice a trigger |
60 | 79f92570 | Panagiotis Kanavos | |
61 | 79f92570 | Panagiotis Kanavos | private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
62 | 79f92570 | Panagiotis Kanavos | |
63 | 79f92570 | Panagiotis Kanavos | private readonly IdleBatch<FileSystemEventArgs> _idleBatch; |
64 | 79f92570 | Panagiotis Kanavos | private readonly Action<Dictionary<string, FileSystemEventArgs[]>> _callback; |
65 | 79f92570 | Panagiotis Kanavos | |
66 | 79f92570 | Panagiotis Kanavos | public FileEventIdleBatch(int idleTimeout, Action<Dictionary<string, FileSystemEventArgs[]>> callback) |
67 | 79f92570 | Panagiotis Kanavos | { |
68 | 79f92570 | Panagiotis Kanavos | _callback = callback; |
69 | 79f92570 | Panagiotis Kanavos | _idleBatch = new IdleBatch<FileSystemEventArgs>(idleTimeout, Process); |
70 | 79f92570 | Panagiotis Kanavos | } |
71 | 79f92570 | Panagiotis Kanavos | |
72 | 79f92570 | Panagiotis Kanavos | public void Post(FileSystemEventArgs arg) |
73 | 79f92570 | Panagiotis Kanavos | { |
74 | 79f92570 | Panagiotis Kanavos | if (Log.IsDebugEnabled) |
75 | 79f92570 | Panagiotis Kanavos | Log.DebugFormat("Batch Post {0}:{1}", arg.ChangeType.ToString("g"), arg.FullPath); |
76 | 79f92570 | Panagiotis Kanavos | |
77 | 79f92570 | Panagiotis Kanavos | _idleBatch.Post(arg); |
78 | 79f92570 | Panagiotis Kanavos | } |
79 | 79f92570 | Panagiotis Kanavos | |
80 | 79f92570 | Panagiotis Kanavos | public void ForceTrigger() |
81 | 79f92570 | Panagiotis Kanavos | { |
82 | 79f92570 | Panagiotis Kanavos | _idleBatch.ForceTrigger(); |
83 | 79f92570 | Panagiotis Kanavos | } |
84 | 79f92570 | Panagiotis Kanavos | |
85 | 79f92570 | Panagiotis Kanavos | |
86 | 79f92570 | Panagiotis Kanavos | protected virtual void Process(FileSystemEventArgs[] args) |
87 | 79f92570 | Panagiotis Kanavos | { |
88 | 79f92570 | Panagiotis Kanavos | var dict = new Dictionary<string, FileSystemEventArgs[]>(); |
89 | 79f92570 | Panagiotis Kanavos | foreach (var arg in args) |
90 | 79f92570 | Panagiotis Kanavos | { |
91 | 79f92570 | Panagiotis Kanavos | |
92 | 79f92570 | Panagiotis Kanavos | if (arg.ChangeType == WatcherChangeTypes.Created ) |
93 | 79f92570 | Panagiotis Kanavos | dict[arg.FullPath] = new[] { arg }; |
94 | 79f92570 | Panagiotis Kanavos | else if (arg.ChangeType == WatcherChangeTypes.Renamed) |
95 | 79f92570 | Panagiotis Kanavos | { |
96 | 79f92570 | Panagiotis Kanavos | var renamedArg = (RenamedEventArgs)arg; |
97 | 79f92570 | Panagiotis Kanavos | FileSystemEventArgs[] oldValue; |
98 | 79f92570 | Panagiotis Kanavos | if (dict.TryGetValue(renamedArg.OldFullPath, out oldValue)) |
99 | 79f92570 | Panagiotis Kanavos | { |
100 | 79f92570 | Panagiotis Kanavos | dict.Remove(renamedArg.OldFullPath); |
101 | 79f92570 | Panagiotis Kanavos | var last = oldValue.Last(); |
102 | 79f92570 | Panagiotis Kanavos | if (last.ChangeType == WatcherChangeTypes.Created) |
103 | 79f92570 | Panagiotis Kanavos | { |
104 | 79f92570 | Panagiotis Kanavos | var createRenamed = new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(renamedArg.FullPath), |
105 | 79f92570 | Panagiotis Kanavos | renamedArg.Name); |
106 | 79f92570 | Panagiotis Kanavos | dict[renamedArg.FullPath] = new[] {createRenamed}; |
107 | 79f92570 | Panagiotis Kanavos | } |
108 | 79f92570 | Panagiotis Kanavos | else |
109 | 79f92570 | Panagiotis Kanavos | dict[renamedArg.FullPath] = new[] { renamedArg }; |
110 | 79f92570 | Panagiotis Kanavos | } |
111 | 79f92570 | Panagiotis Kanavos | else |
112 | 79f92570 | Panagiotis Kanavos | dict[renamedArg.FullPath] = new[] { renamedArg}; |
113 | 79f92570 | Panagiotis Kanavos | } |
114 | 79f92570 | Panagiotis Kanavos | else |
115 | 79f92570 | Panagiotis Kanavos | { |
116 | 79f92570 | Panagiotis Kanavos | FileSystemEventArgs[] oldValue; |
117 | 79f92570 | Panagiotis Kanavos | var hasValue=dict.TryGetValue(arg.FullPath, out oldValue); |
118 | 79f92570 | Panagiotis Kanavos | var last = hasValue?oldValue.LastOrDefault():null; |
119 | 79f92570 | Panagiotis Kanavos | |
120 | 79f92570 | Panagiotis Kanavos | if (last==null || last.ChangeType == WatcherChangeTypes.Changed) |
121 | 79f92570 | Panagiotis Kanavos | { |
122 | 79f92570 | Panagiotis Kanavos | dict[arg.FullPath] = new[] { arg}; |
123 | 79f92570 | Panagiotis Kanavos | } |
124 | 79f92570 | Panagiotis Kanavos | else if (arg.ChangeType == WatcherChangeTypes.Deleted) |
125 | 79f92570 | Panagiotis Kanavos | { |
126 | 79f92570 | Panagiotis Kanavos | if (last.ChangeType == WatcherChangeTypes.Created) |
127 | 79f92570 | Panagiotis Kanavos | dict.Remove(arg.FullPath); |
128 | 79f92570 | Panagiotis Kanavos | else |
129 | 79f92570 | Panagiotis Kanavos | { |
130 | 79f92570 | Panagiotis Kanavos | dict[arg.FullPath] = new[] { arg }; |
131 | 79f92570 | Panagiotis Kanavos | } |
132 | 79f92570 | Panagiotis Kanavos | } |
133 | 79f92570 | Panagiotis Kanavos | else if (last.ChangeType == WatcherChangeTypes.Renamed && arg.ChangeType == WatcherChangeTypes.Changed) |
134 | 79f92570 | Panagiotis Kanavos | { |
135 | 79f92570 | Panagiotis Kanavos | var newValue = oldValue.Concat(new[] { arg }).ToArray(); |
136 | 79f92570 | Panagiotis Kanavos | dict[arg.FullPath] = newValue; |
137 | 79f92570 | Panagiotis Kanavos | } |
138 | 79f92570 | Panagiotis Kanavos | |
139 | 79f92570 | Panagiotis Kanavos | } |
140 | 79f92570 | Panagiotis Kanavos | } |
141 | 79f92570 | Panagiotis Kanavos | _callback(dict); |
142 | 79f92570 | Panagiotis Kanavos | } |
143 | 79f92570 | Panagiotis Kanavos | |
144 | 79f92570 | Panagiotis Kanavos | } |
145 | 79f92570 | Panagiotis Kanavos | |
146 | 79f92570 | Panagiotis Kanavos | } |