private Option <ADSK.File> DownloadConfiguration(string configPath, int networkRetries, string synchronizerConfigurationPath, Option <MCADCommon.LogCommon.DisposableFileLogger> logger, List <string> errors)
        {
            ADSK.File[]        configurationFiles = connection.WebServiceManager.DocumentService.FindLatestFilesByPaths(new String[] { synchronizerConfigurationPath });
            Option <ADSK.File> configurationFile  = Option.None;

            if (configurationFiles.Count() > 0)
            {
                VaultCommunication.DownloadFilesWithChecksum(connection, new List <VaultEagleLib.Model.DataStructures.DownloadFile>()
                {
                    new VaultEagleLib.Model.DataStructures.DownloadFile(configurationFiles[0], configPath, false, false)
                }, logger, networkRetries);                                                                                                                                                                                                                            /*MCADCommon.VaultCommon.FileOperations.DownloadFile(connection, configurationFiles[0], path: configPath);*/
                if (VaultUtils.HandleNetworkErrors(() => !System.IO.File.Exists(Path.Combine(configPath, configurationFiles[0].Name)), networkRetries))
                {
                    logger.IfSomeDo(l => l.Error("Failed to download configuration file."));
                    errors.Add("Failed to download configuration file.");
                    //if (mailInfo.IsSome)
                    //{
                    //    MCADCommon.MailCommon.Mailer mailer = new MCADCommon.MailCommon.Mailer(mailInfo.Get());
                    //    mailer.Mail("Vault synchronizer failed", errors.StringJoin("\n\r"), new List<string>());
                    //}
                }
                configurationFile = configurationFiles[0].AsOption();
            }
            else
            {
                logger.IfSomeDo(l => l.Error("Could not find configuration file."));
                errors.Add("Could not find configuration file.");
                //if (mailInfo.IsSome)
                //{
                //    MCADCommon.MailCommon.Mailer mailer = new MCADCommon.MailCommon.Mailer(mailInfo.Get());
                //    mailer.Mail("Vault synchronizer failed", errors.StringJoin("\n\r"), new List<string>());
                //}
            }
            return(configurationFile);
        }
示例#2
0
 public static string[] GetPathsFromSelections(VaultCommunication vaultCom, ISelection[] selSet)
 {
     long[] selectedFileIds       = (from x in selSet where x.TypeId == SelectionTypeId.FileVersion select x.Id).ToArray();
     long[] selectedMasterFileIds = (from x in selSet where x.TypeId == SelectionTypeId.File select x.Id).ToArray();
     long[] selectedFolderIds     = (from x in selSet where x.TypeId == SelectionTypeId.Folder select x.Id).ToArray();
     return(vaultCom.GetPathsFromSelections(selectedFileIds, selectedMasterFileIds, selectedFolderIds));
 }
示例#3
0
        public ShowSubscriptionsForm(SynchronizationTree tree, Action <bool> startSyncThread, VaultCommunication vaultCom)
        {
            this.tree            = tree;
            this.startSyncThread = startSyncThread;
            this.vaultCom        = vaultCom;

            InitializeComponent();
            SubscriptionTree.Nodes.Clear();

            removeToolStripMenuItem.ShortcutKeys = Keys.Delete;
            RedrawTree();
            SubscriptionTree.ExpandAll();
        }
        private List <string> SynchronizeFileBatches(List <VaultEagleLib.Model.DataStructures.DownloadItem> fileFolders, VaultEagleLib.SynchronizationItem[] items, Option <MCADCommon.LogCommon.DisposableFileLogger> logger, int retries)
        {
            // foreach (VaultEagleLib.SynchronizationItem item in items)
            //   item.HandleLockedFiles(fileFolders, retries, logger);

            List <VaultEagleLib.Model.DataStructures.DownloadFolder> folders = fileFolders.OfType <VaultEagleLib.Model.DataStructures.DownloadFolder>().ToList();//Where(f => f.Item1 == null).ToList();

            foreach (VaultEagleLib.Model.DataStructures.DownloadFolder folder in folders)
            {
                if (!VaultEagle.VaultUtils.HandleNetworkErrors(() => Directory.Exists(folder.DownloadPath), retries))
                {
                    VaultEagle.VaultUtils.HandleNetworkErrors(() => Directory.CreateDirectory(folder.DownloadPath), retries);
                }
            }
            return(VaultCommunication.DownloadFilesWithChecksum(connection, fileFolders.OfType <VaultEagleLib.Model.DataStructures.DownloadFile>().ToList(), logger, retries));
        }
示例#5
0
        public void OnLogOn(IApplication application)
        {
            vaultCom         = new VaultCommunication();
            this.application = application;

            invokeControl.DoThreadSafeAsync(() =>
            {
                if (application.Connection != null)
                {
                    InitializeFromConnectionOnLogon();
                }
                else
                {
                    CallInitializeLater();
                }
            });
        }
        public void Synchronize()
        {
#if DEBUG
            var watch = System.Diagnostics.Stopwatch.StartNew();
#endif
            System.Diagnostics.Debug.WriteLine("SynchronizationThread.Run()");
            StopCheck();

            if (syncTree.IsEmpty())
            {
                logWindow.Log("Not subscribed to any files, nothing to do.");
                logWindow.LogDone();
                return;
            }

            using (VaultCommunication vaultCom = new VaultCommunication()
            {
                connection = connection,
                manager = connection.WebServiceManager,
                UserId = connection.UserID,
                cache = new FunctionJsonCache(),
                Log = s => logWindow.Log(s),
                stopThread = StopThread
            })
            {
                vaultCom.ResetWorkingFoldersIfNecessary();

                StopCheck();
                logWindow.Log("Getting list of files from Vault...");
                sysTray.Start();
                sysTray.ShowIfSlow("Getting info from Vault...           ");
                StopCheck();
                List <string> missingFiles = new List <string>(), missingFolders = new List <string>();
                var           foldersToCreate       = new List <Folder>();
                var           files                 = new List <FileFolder>();
                Action        getFilesToSynchronize = () =>
                                                      files = vaultCom.GetFilesToSynchronize(syncTree, missingFolders: missingFolders, missingFiles: missingFiles, watchedFolders: foldersToCreate);
                getFilesToSynchronize();
                StopCheck();
                if (missingFolders.Any() || missingFiles.Any())
                {
                    logWindow.Log("Missing folder/files!");
                    if (vaultCom.TryRepairSynchronizationTree(syncTree))
                    {
                        getFilesToSynchronize();
                        logWindow.Log("Getting list of files from Vault again...");
                    }
                }

                //foreach (var fileFolder in files)
                //{
                //    Console.WriteLine(fileFolder.Folder.FullName + "/" + fileFolder.File.VerName);
                //}

#if DEBUG
                logWindow.Log("Time elapsed " + watch.ElapsedMilliseconds + "ms");
#endif

                logWindow.Log("");
                logWindow.Log("Checking if files are up to date (" + files.Count + " files)...");
                sysTray.ShowIfSlow("Getting info from Vault (watching " + files.Count + " files)...");

                StopCheck();
                var fileStatuses = files
                                   .Select(filefolder =>
                {
                    StopCheck();
                    var localPath = syncTree.GetLocalPathOfPath(VaultCommunication.GeneratePathFromFolderAndFile(filefolder));
                    Dbg.Trace("before vaultCom.QuickLocalFileStatus(filefolder.File, ...");
                    return(new
                    {
                        localPath,
                        filefolder,
                        status = localPath.IsSome
                                                ? vaultCom.QuickLocalFileStatus(filefolder.File, localPath.Get())
                                                : vaultCom.QuickLocalFileStatus(filefolder.File, filefolder.Folder),
                    });
                })
                                   .ToList();
                StopCheck();
                Dbg.Trace("after var fileStatuses = ...");

                //logWindow.Log(string.Join("\r\n",fileStatuses.Select(x => x.file.VerName + ": " + x.status.ToString()).ToArray()));

                var partition    = fileStatuses.PartitionBy(x => x.status.VersionState == EntityStatus.VersionStateEnum.Unknown);
                var unknownFiles = partition[true];
                fileStatuses = partition[false];

                partition = fileStatuses.PartitionBy(x => x.status.CheckoutState == EntityStatus.CheckoutStateEnum.CheckedOutByCurrentUser);
                var checkedOutByCurrentUserFiles = partition[true];
                fileStatuses = partition[false];

                logWindow.Log(checkedOutByCurrentUserFiles.Count + " files checked out by current user (skipped)");

                partition = fileStatuses.PartitionBy(x => x.status.VersionState == EntityStatus.VersionStateEnum.MatchesLatestVaultVersion && x.status.LocalEditsState == EntityStatus.LocalEditsStateEnum.DoesNotHaveLocalEdits);
                var filesUpToDate = partition[true];
                fileStatuses = partition[false];

                logWindow.Log(filesUpToDate.Count + " files up to date");

                if (!syncTree.Config.OverwriteLocallyModifiedFiles)
                {
                    partition = fileStatuses.PartitionBy(x => x.status.LocalEditsState == EntityStatus.LocalEditsStateEnum.HasLocalEdits);
                    var locallyModified = partition[true];
                    fileStatuses = partition[false];

                    logWindow.Log(locallyModified.Count + " files locally modified:");

                    foreach (var item in locallyModified)
                    {
                        logWindow.Log("  " + item.filefolder.File.VerName);
                    }
                }

                var filesToUpdate = fileStatuses.ToList();

                logWindow.Log("");
                Dbg.Trace("before if (filesToUpdate.Count != 0)");
                int numberOfErrors = missingFiles.Count + missingFolders.Count + unknownFiles.Count;
                if (filesToUpdate.Count != 0)
                {
                    logWindow.Log("Downloading " + filesToUpdate.Count + " files...");
                    sysTray.ShowNow("Getting info from Vault (watching " + files.Count + " files)...\r\n" + filesToUpdate.Count + " files out of date. Downloading (1/" + filesToUpdate.Count + ")...");
                    logWindow.LogWithProgress(null, 0);
                    int count = 0;
                    var failedDownloadsQueue = new List <string>();
                    Dbg.Trace("before vaultCom.DownloadFiles(...");
                    vaultCom.DownloadFiles(filesToUpdate.Select(x => Tuple.Create(x.filefolder, x.localPath)).ToArray(), failedDownloadsQueue, afterDownload: () =>
                    {
                        Dbg.Trace("vaultCom.DownloadFiles, afterDownload");
                        count++;
                        sysTray.ShowIfSlow("Getting info from Vault (watching " + files.Count + " files)...\r\n" + filesToUpdate.Count + " files out of date. Downloading (" + count + "/" + filesToUpdate.Count + ")...");
                        int progress = (int)Math.Round(100.0 * count / filesToUpdate.Count);
                        logWindow.LogWithProgress(null, progress);
                        StopCheck();
                    });
                    failedDownloads = failedDownloadsQueue.ToList();
                    numberOfErrors += failedDownloads.Count;
                    sysTray.ShowIfSlow("Getting info from Vault (watching " + files.Count + " files)...\r\n" + filesToUpdate.Count + " files out of date. Downloaded " + (filesToUpdate.Count - failedDownloads.Count) + " files, checking folders...");
                }

                logWindow.Log("Ensuring folder structure up to date...");
                try
                {
                    foreach (var folder in foldersToCreate)
                    {
                        StopCheck();
                        string localPath = syncTree.GetLocalPathOfPath(folder.FullName + '/').Else(() => vaultCom.GetLocalPathFromFolder(folder));
                        if (!System.IO.Directory.Exists(localPath))
                        {
                            System.IO.Directory.CreateDirectory(localPath);
                            logWindow.Log("  created " + folder.FullName + " locally");
                        }
                    }
                }
                catch (StopThreadException)
                {
                    throw;
                }
                catch { }

                if (!dontUpdateConfig)
                {
                    logWindow.Log("Updating config file...");
                    vaultCom.UpdateLastVaultId(syncTree);
                }
                StopCheck();

                if (filesToUpdate.Count == 0)
                {
                    logWindow.Log("");
                    logWindow.Log("No file to download");

                    if (numberOfErrors == 0)
                    {
                        sysTray.ShowNow("Getting info from Vault (watching " + files.Count + " files)...\r\nAll up to date!", ignoreMinimumDisplayTime: true);
                    }
                    else
                    {
                        sysTray.ShowNow("Getting info from Vault (watching " + files.Count + " files)...\r\nNothing to download.\r\nErrors occurred.", ignoreMinimumDisplayTime: true);
                    }
                }
                else
                {
                    sysTray.ShowNow("Getting info from Vault (watching " + files.Count + " files)...\r\n" + filesToUpdate.Count + " files out of date. Downloaded " + (filesToUpdate.Count - failedDownloads.Count) + " files!" + (numberOfErrors == 0 ? "" : "\r\nErrors occurred."), ignoreMinimumDisplayTime: true);
                }

                logWindow.Log("Done.");
                logWindow.LogDone();
#if DEBUG
                logWindow.Log("Time elapsed " + watch.ElapsedMilliseconds + "ms");
#endif

                if (numberOfErrors > 0)
                {
                    logWindow.Log("");
                    logWindow.Log("Errors:");
                    logWindow.Show();
                }

                // errors
                foreach (var item in missingFiles)
                {
                    errors.Add("ERROR: Couldn't find file in Vault: " + item);
                }
                foreach (var item in missingFolders)
                {
                    errors.Add("ERROR: Couldn't find folder in Vault: " + item);
                }
                foreach (var item in unknownFiles)
                {
                    errors.Add("ERROR: Couldn't get status for " + item.filefolder.File.VerName);
                }
                foreach (var item in failedDownloads)
                {
                    errors.Add("ERROR: Couldn't download " + item);
                }

                foreach (var error in errors)
                {
                    logWindow.Log(error);
                }
            }
        }