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 | } |