Statistics
| Branch: | Revision:

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
}