Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / PithosWorkflow.cs @ 89472316

History | View | Annotate | Download (4.8 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="PithosWorkflow.cs" company="GRNet">
4 255f5f86 Panagiotis Kanavos
 * 
5 255f5f86 Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 255f5f86 Panagiotis Kanavos
 *
7 255f5f86 Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 255f5f86 Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 255f5f86 Panagiotis Kanavos
 * conditions are met:
10 255f5f86 Panagiotis Kanavos
 *
11 255f5f86 Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 255f5f86 Panagiotis Kanavos
 *      disclaimer.
14 255f5f86 Panagiotis Kanavos
 *
15 255f5f86 Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 255f5f86 Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 255f5f86 Panagiotis Kanavos
 *      provided with the distribution.
19 255f5f86 Panagiotis Kanavos
 *
20 255f5f86 Panagiotis Kanavos
 *
21 255f5f86 Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 255f5f86 Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 255f5f86 Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 255f5f86 Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 255f5f86 Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 255f5f86 Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 255f5f86 Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 255f5f86 Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 255f5f86 Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 255f5f86 Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 255f5f86 Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 255f5f86 Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 255f5f86 Panagiotis Kanavos
 *
34 255f5f86 Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 255f5f86 Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 255f5f86 Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 255f5f86 Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 255f5f86 Panagiotis Kanavos
 * </copyright>
39 255f5f86 Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 255f5f86 Panagiotis Kanavos
 */
41 255f5f86 Panagiotis Kanavos
#endregion
42 255f5f86 Panagiotis Kanavos
using System;
43 d78cbf09 Panagiotis Kanavos
using System.Collections.Generic;
44 d78cbf09 Panagiotis Kanavos
using System.ComponentModel.Composition;
45 d78cbf09 Panagiotis Kanavos
using System.Linq;
46 d78cbf09 Panagiotis Kanavos
using System.Runtime.InteropServices;
47 d78cbf09 Panagiotis Kanavos
using System.Text;
48 d78cbf09 Panagiotis Kanavos
using System.Threading;
49 d78cbf09 Panagiotis Kanavos
using System.Threading.Tasks;
50 d78cbf09 Panagiotis Kanavos
using Pithos.Interfaces;
51 d78cbf09 Panagiotis Kanavos
using System.IO;
52 5ce54458 Panagiotis Kanavos
using System.Diagnostics;
53 77e10b4f Panagiotis Kanavos
using Pithos.Network;
54 d78cbf09 Panagiotis Kanavos
55 d78cbf09 Panagiotis Kanavos
namespace Pithos.Core
56 d78cbf09 Panagiotis Kanavos
{
57 d78cbf09 Panagiotis Kanavos
    [Export(typeof(IPithosWorkflow))]
58 d78cbf09 Panagiotis Kanavos
    public class PithosWorkflow:IPithosWorkflow
59 d78cbf09 Panagiotis Kanavos
    {
60 d78cbf09 Panagiotis Kanavos
        [Import]
61 d78cbf09 Panagiotis Kanavos
        public IPithosSettings Settings { get; set; }
62 d78cbf09 Panagiotis Kanavos
63 d78cbf09 Panagiotis Kanavos
        [Import]
64 d78cbf09 Panagiotis Kanavos
        public IStatusKeeper StatusKeeper { get; set; }
65 d78cbf09 Panagiotis Kanavos
66 d78cbf09 Panagiotis Kanavos
        public FileStatus SetFileStatus(string path, FileStatus status)
67 d78cbf09 Panagiotis Kanavos
        {
68 77e10b4f Panagiotis Kanavos
            Debug.Assert(!path.Contains(FolderConstants.CacheFolder));
69 5ce54458 Panagiotis Kanavos
            Debug.Assert(!path.EndsWith(".ignore",StringComparison.InvariantCultureIgnoreCase));
70 5ce54458 Panagiotis Kanavos
71 d78cbf09 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
72 d78cbf09 Panagiotis Kanavos
                throw new ArgumentNullException("path", "The path parameter must not be emtpy");
73 d78cbf09 Panagiotis Kanavos
74 d78cbf09 Panagiotis Kanavos
            var oldStatus=StatusKeeper.GetFileStatus(path);
75 d78cbf09 Panagiotis Kanavos
76 d78cbf09 Panagiotis Kanavos
            if (oldStatus == status)
77 d78cbf09 Panagiotis Kanavos
                return oldStatus;
78 d78cbf09 Panagiotis Kanavos
79 d78cbf09 Panagiotis Kanavos
            switch(oldStatus)
80 d78cbf09 Panagiotis Kanavos
            {
81 d78cbf09 Panagiotis Kanavos
                case FileStatus.Unchanged :
82 d78cbf09 Panagiotis Kanavos
                    break;
83 d78cbf09 Panagiotis Kanavos
                case FileStatus.Created:
84 d78cbf09 Panagiotis Kanavos
                    if (status == FileStatus.Modified)
85 d78cbf09 Panagiotis Kanavos
                        return oldStatus;
86 d78cbf09 Panagiotis Kanavos
                    break;
87 d78cbf09 Panagiotis Kanavos
                case FileStatus.Modified:
88 d78cbf09 Panagiotis Kanavos
                case FileStatus.Renamed:
89 d78cbf09 Panagiotis Kanavos
                    if (status == FileStatus.Created)
90 d78cbf09 Panagiotis Kanavos
                        return oldStatus;
91 d78cbf09 Panagiotis Kanavos
                    break;
92 d78cbf09 Panagiotis Kanavos
            }
93 d78cbf09 Panagiotis Kanavos
            StatusKeeper.SetFileStatus(path, status);
94 d78cbf09 Panagiotis Kanavos
            return status;
95 d78cbf09 Panagiotis Kanavos
        }
96 d78cbf09 Panagiotis Kanavos
97 d78cbf09 Panagiotis Kanavos
        public void ClearFileStatus(string path)
98 d78cbf09 Panagiotis Kanavos
        {
99 d78cbf09 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
100 d78cbf09 Panagiotis Kanavos
                throw new ArgumentNullException("path", "The path parameter must not be emtpy");
101 d78cbf09 Panagiotis Kanavos
102 cfed7823 Panagiotis Kanavos
            StatusKeeper.ClearFileStatus(path.ToLower());
103 d78cbf09 Panagiotis Kanavos
        }
104 5ce54458 Panagiotis Kanavos
       
105 d78cbf09 Panagiotis Kanavos
106 d78cbf09 Panagiotis Kanavos
        public Task<FileStream> OpenStreamWithWaiting(string path)
107 d78cbf09 Panagiotis Kanavos
        {
108 d78cbf09 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
109 d78cbf09 Panagiotis Kanavos
                throw new ArgumentNullException("path","The path parameter must not be emtpy");
110 d78cbf09 Panagiotis Kanavos
111 d78cbf09 Panagiotis Kanavos
            if (!File.Exists(path))
112 d78cbf09 Panagiotis Kanavos
                throw new FileNotFoundException("The specified file or path does not exist", path);
113 d78cbf09 Panagiotis Kanavos
114 d78cbf09 Panagiotis Kanavos
            return new Task<FileStream>(() =>
115 d78cbf09 Panagiotis Kanavos
                    {
116 d78cbf09 Panagiotis Kanavos
                        int counter = 0;
117 d78cbf09 Panagiotis Kanavos
                        while (true)
118 d78cbf09 Panagiotis Kanavos
                        {
119 d78cbf09 Panagiotis Kanavos
                            try
120 d78cbf09 Panagiotis Kanavos
                            {
121 d78cbf09 Panagiotis Kanavos
                                var stream=File.OpenRead(path);
122 d78cbf09 Panagiotis Kanavos
                                return stream;                                
123 d78cbf09 Panagiotis Kanavos
                            }
124 0af3141d Panagiotis Kanavos
                            catch 
125 d78cbf09 Panagiotis Kanavos
                            {
126 d78cbf09 Panagiotis Kanavos
                                Thread.Sleep(500);
127 d78cbf09 Panagiotis Kanavos
                                if (++counter > 10)
128 d78cbf09 Panagiotis Kanavos
                                    throw;
129 d78cbf09 Panagiotis Kanavos
                            }
130 d78cbf09 Panagiotis Kanavos
                        }
131 d78cbf09 Panagiotis Kanavos
                    });
132 d78cbf09 Panagiotis Kanavos
        }
133 d78cbf09 Panagiotis Kanavos
    }
134 d78cbf09 Panagiotis Kanavos
}