示例#1
0
        public Task<Fileset> Add()
        {
            return Task.Factory.StartNew(() =>
            {
                var fs = new Fileset
                {
                    Id = Guid.NewGuid(),
                    Name = "New fileset"
                };

                fs.OnCopyScripts.Add(new ScriptFile
                {
                    Path = Path.Combine("Scripts", "Events", "Copy.rb")
                });

                fs.OnCopyErrorScripts.Add(new ScriptFile
                {
                    Path = Path.Combine("Scripts", "Events", "CopyError.rb")
                });

                fs.OnCopySuccessScripts.Add(new ScriptFile
                {
                    Path = Path.Combine("Scripts", "Events", "CopySuccess.rb")
                });

                _filesets.Add(fs);
                _filesetAdded.OnNext(fs);

                return fs;
            });
        }
示例#2
0
        public FilesetViewModel(Fileset fileset)
        {
            _fileset = fileset;

            PropertyChangedEventManager.AddListener(_fileset, this, string.Empty);

            OnCopyScript = new ScriptViewModel(_fileset.OnCopyScripts) { Title = "On copy-event scripts" };
            OnCopyErrorScript = new ScriptViewModel(_fileset.OnCopyErrorScripts) { Title = "On copy-error-event scripts" };
            OnCopySuccessScript = new ScriptViewModel(_fileset.OnCopySuccessScripts) { Title = "On copy-success-event scripts" };
        }
        public void Execute(Fileset fileset)
        {
            _activityLogService.Log(fileset.Id, "Executing manual copy");

            foreach (var item in fileset.Includes)
            {
                var fileName = Path.GetFileName(item.RelativePath);
                var filePath = FilesetItem.GetFullPath(fileset.SourcePath, item.RelativePath);

                var replicationItem = new ReplicationItem
                {
                    Fileset = fileset,
                    FileName = fileName,
                    FullSourcePath = filePath,
                    FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                };
                replicationItem.Data.LockingProcesses = new string[0];
                _replicationQueue.TryAdd(replicationItem);
            }

            if (fileset.Excludes.Any())
            {
                var relativePath = fileset.Excludes.FirstOrDefault().RelativePath;
                var fullPath = FilesetItem.GetFullPath(fileset.SourcePath, relativePath);
                var directoryName = Path.GetDirectoryName(fullPath);

                if (!string.IsNullOrEmpty(directoryName))
                {
                    IEnumerable<string> files = Directory.GetFiles(directoryName);
                    files = files.Except(fileset.Excludes.Select(f =>
                    {
                        return FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                    }));

                    foreach (var file in files)
                    {
                        var fileName = Path.GetFileName(file);
                        var replicationItem = new ReplicationItem
                        {
                            Fileset = fileset,
                            FileName = fileName,
                            FullSourcePath = file,
                            FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                        };
                        replicationItem.Data.LockingProcesses = new string[0];
                        _replicationQueue.TryAdd(replicationItem);
                    }
                }
            }
        }
        private void FilesetRemoved(Fileset fileset)
        {
            fileset.IsEnabledChanged -= OnFilesetIsEnabledChanged;

            if (fileset.IsEnabled)
            {
                DeactivateFileset(fileset);
            }
        }
        private void FilesetAdded(Fileset fileset)
        {
            fileset.IsEnabledChanged += OnFilesetIsEnabledChanged;

            if (fileset.IsEnabled)
            {
                ActivateFileset(fileset);
            }
        }
        private void DeactivateFileset(Fileset fileset)
        {
            List<IDisposable> watchers;
            if (!_watchers.TryGetValue(fileset, out watchers))
            {
                watchers = new List<IDisposable>();
                _watchers.TryAdd(fileset, watchers);
            }

            watchers.ForEach(watcher => watcher.Dispose());
            watchers.Clear();
        }
        private void ActivateFileset(Fileset fileset)
        {
            List<IDisposable> watchers;
            if (!_watchers.TryGetValue(fileset, out watchers))
            {
                watchers = new List<IDisposable>();
                _watchers.TryAdd(fileset, watchers);
            }

            DeactivateFileset(fileset);

            var distinctIncludeFolders = fileset.Includes.Select(f =>
            {
                var fullPath = FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                return new FileInfo(fullPath).DirectoryName;
            }).Distinct();

            var distinctExcludeFolders = fileset.Excludes.Select(f =>
            {
                var fullPath = FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                return new FileInfo(fullPath).DirectoryName;
            }).Distinct();

            var foldersToWatch = distinctIncludeFolders.Union(distinctExcludeFolders);

            foreach (var folderToWatch in foldersToWatch)
            {
                if (Directory.Exists(folderToWatch))
                {
                    IDisposable observable = GetObservable(folderToWatch)
                        .Buffer(TimeSpan.FromSeconds(2))
                        .Subscribe(t =>
                    {
                        if (t.Any())
                        {
                            var fileNames = t.Distinct();

                            foreach (var filePath in fileNames)
                            {
                                var relativePath = FilesetItem.GetRelativePath(fileset.SourcePath, filePath);

                                if (fileset.Includes.Any(f => f.RelativePath == relativePath))
                                {
                                    var fileName = Path.GetFileName(filePath);
                                    var replicationItem = new ReplicationItem
                                    {
                                        Fileset = fileset,
                                        FileName = fileName,
                                        FullSourcePath = filePath,
                                        FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                                    };
                                    replicationItem.Data.LockingProcesses = new string[0];
                                    _replicationQueue.TryAdd(replicationItem);
                                }

                                if (fileset.Excludes.Any())
                                {
                                    string directoryName = Path.GetDirectoryName(filePath);

                                    if (!string.IsNullOrEmpty(directoryName))
                                    {
                                        IEnumerable<string> files = Directory.GetFiles(directoryName);
                                        files = files.Except(fileset.Excludes.Select(f =>
                                        {
                                            return FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                                        }));

                                        foreach (var file in files)
                                        {
                                            var fileName = Path.GetFileName(file);
                                            var replicationItem = new ReplicationItem
                                            {
                                                Fileset = fileset,
                                                FileName = fileName,
                                                FullSourcePath = filePath,
                                                FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                                            };
                                            replicationItem.Data.LockingProcesses = new string[0];

                                            _replicationQueue.TryAdd(replicationItem);
                                        }
                                    }
                                }
                            }
                        }
                    });

                    watchers.Add(observable);
                }
            }
        }
示例#8
0
        private static void SaveFileset(Fileset fileset)
        {
            var filePath = GetFilesetPath(fileset);

            using (var stream = File.Create(filePath))
            using (var textWriter = new StreamWriter(stream))
            using (var jsonWriter = new JsonTextWriter(textWriter))
            {
                jsonWriter.Formatting = Formatting.Indented;
                var serializer = new JsonSerializer();
                serializer.TypeNameHandling = TypeNameHandling.Objects;
                serializer.Serialize(jsonWriter, fileset);
            }
        }
示例#9
0
 private static string GetFilesetPath(Fileset fileset)
 {
     string fileName = fileset.Id.ToString() + ".fis";
     string filePath = Path.Combine(AppConstants.FileSetsFolder, fileName);
     return filePath;
 }
示例#10
0
 public Task Save(Fileset fileset, Func<Stream> streamFactory)
 {
     return Task.Factory.StartNew(s =>
     {
         var factory = (Func<Stream>)s;
         using (var stream = factory())
         using (var textWriter = new StreamWriter(stream))
         using (var jsonWriter = new JsonTextWriter(textWriter))
         {
             jsonWriter.Formatting = Formatting.Indented;
             var serializer = new JsonSerializer();
             serializer.TypeNameHandling = TypeNameHandling.Objects;
             serializer.Serialize(jsonWriter, fileset);
         }
     }, streamFactory);
 }
示例#11
0
 public Task<Fileset> Save(Fileset fileset)
 {
     return Task.Factory.StartNew(() =>
     {
         SaveFileset(fileset);
         return fileset;
     });
 }
示例#12
0
        public Task Remove(Fileset fileset)
        {
            return Task.Factory.StartNew(() =>
            {
                string path = GetFilesetPath(fileset);

                if (File.Exists(path))
                {
                    File.Delete(path);
                }

                if (_filesets.Remove(fileset))
                {
                    _filesetRemoved.OnNext(fileset);
                }
            });
        }
        private static string GetBalloonTipTitle(Fileset fileset)
        {
            string title = string.Empty;

            if (!string.IsNullOrEmpty(fileset.Category))
            {
                title += "[" + fileset.Category + "] ";
            }

            title += fileset.Name;
            return title;
        }