/// <summary> /// Returns all plugin DLLs found in the specified directories /// </summary> /// <param name="vstDirectories">The VST directories to scan</param> /// <param name="applicationProgress">The progress reporter</param> /// <returns></returns> public HashSet <string> GetPluginDlls(IList <VstDirectory> vstDirectories, ApplicationProgress applicationProgress) { var vstPluginDLLFiles = new HashSet <string>(); var dllFiles = new List <string>(); var directoriesToScan = (from directory in vstDirectories where directory.Active select directory).ToList(); var progressStatus = new CountProgress(directoriesToScan.Count); foreach (var i in directoriesToScan) { progressStatus.Current = directoriesToScan.IndexOf(i); progressStatus.Status = i.Path; applicationProgress.Progress.Report(progressStatus); if (applicationProgress.CancellationToken.IsCancellationRequested) { return(vstPluginDLLFiles); } try { var vstPlugins = new List <string>(); foreach (var file in Directory.EnumerateFiles( i.Path, "*.dll", SearchOption.AllDirectories)) { vstPlugins.Add(file); progressStatus.Status = file; applicationProgress.Progress.Report(progressStatus); } dllFiles = vstPlugins; } catch (Exception e) { applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error, $"Unable to scan {i.Path} because of {e.Message}")); } if (dllFiles.Count > 0) { vstPluginDLLFiles.AddRange(dllFiles); } } return(vstPluginDLLFiles); }
// GET: Data/ApplicationProgressManagement/Delete/5 public async Task <ActionResult> Delete(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } ApplicationProgress applicationProgress = await _ctx.ApplicationProgress.FindAsync(id); if (applicationProgress == null) { return(HttpNotFound()); } return(View(applicationProgress)); }
/// <summary> /// Checks all plugins in the list if they are present and if their DLL hashes have changes /// </summary> /// <returns>List of newly created plugins which were created because their DLL hash has changed</returns> public async Task <List <Plugin> > VerifyPlugins(IList <Plugin> plugins, HashSet <string> dllPaths, ApplicationProgress applicationProgress) { var remoteFileService = _remoteVstService.GetRemoteVstService(); var pluginsToAdd = new List <Plugin>(); var progressStatus = new CountProgress(plugins.Count); foreach (var plugin in plugins.ToList()) { if (applicationProgress.CancellationToken.IsCancellationRequested) { return(pluginsToAdd); } try { progressStatus.Status = $"Verifying {plugin.DllPath}"; progressStatus.Current = plugins.IndexOf(plugin); applicationProgress.Progress.Report(progressStatus); await UpdatePluginLocations(plugin); plugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion); if (plugin.PluginLocation != null && !plugin.PluginLocation.IsPresent) { var newPluginLocation = (from p in plugin.PluginLocations where p.IsPresent select p).FirstOrDefault(); plugin.PluginLocation = newPluginLocation; } foreach (var pluginLocation in plugin.PluginLocations) { if (pluginLocation.IsPresent) { dllPaths.Remove(pluginLocation.DllPath); } } plugin.NativeInstrumentsResource.Load(plugin); } catch (Exception e) { plugin.LogPluginError("verifying plugin", e); } } foreach (var dllPath in dllPaths) { var newPlugin = new Plugin { PluginLocation = new PluginLocation { DllPath = dllPath, DllHash = await GetDllHash(dllPath), LastModifiedDateTime = remoteFileService.GetLastModifiedDate(dllPath), IsPresent = true } }; newPlugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion); progressStatus.Status = $"Adding Plugin {newPlugin.PluginLocation.DllPath}"; applicationProgress.Progress.Report(progressStatus); pluginsToAdd.Add(newPlugin); } return(pluginsToAdd); }
UpdateMetadata(IList <Plugin> pluginsToUpdate, ApplicationProgress applicationProgress) { var pluginsToRemove = new List <Plugin>(); var mergedPlugins = new List <(Plugin oldPlugin, Plugin mergedIntoPlugin)>(); var progressStatus = new CountProgress(pluginsToUpdate.Count); foreach (var plugin in pluginsToUpdate) { if (applicationProgress.CancellationToken.IsCancellationRequested) { return(pluginsToRemove, mergedPlugins); } try { _globalFrontendService.SelectedPlugin = plugin; progressStatus.Current = pluginsToUpdate.IndexOf(plugin); progressStatus.Status = $"Loading metadata for {plugin.DllFilename}"; applicationProgress.Progress.Report(progressStatus); var originalPluginLocation = plugin.PluginLocation; foreach (var pluginLocation in plugin.PluginLocations) { if (pluginLocation.IsPresent && plugin.RequiresMetadataScan /*pluginLocation.LastMetadataAnalysisVersion != _globalService.PresetMagicianVersion && * (!pluginLocation.HasMetadata || plugin.RequiresMetadataScan || pluginLocation.PresetParser == null || (pluginLocation.PresetParser != null && * pluginLocation.PresetParser.RequiresRescan()))*/) { plugin.PluginLocation = pluginLocation; pluginLocation.LastMetadataAnalysisVersion = _globalService.PresetMagicianVersion; using (var remotePluginInstance = _remoteVstService.GetRemotePluginInstance(plugin, false)) { try { await remotePluginInstance.LoadPlugin(); plugin.Logger.Debug($"Attempting to find presetParser for {plugin.PluginName}"); pluginLocation.PresetParser = null; _vendorPresetParserService.DeterminatePresetParser(remotePluginInstance); remotePluginInstance.UnloadPlugin(); } catch (Exception e) { applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error, $"Error while loading metadata for {plugin.DllPath}: {e.GetType().FullName} {e.Message}")); LogTo.Debug(e.StackTrace); } } } } plugin.PluginLocation = originalPluginLocation; plugin.EnsurePluginLocationIsPresent(); plugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion); if (!plugin.HasMetadata && plugin.PluginLocation == null && plugin.Presets.Count == 0) { // No metadata and still no plugin location dll => remove it applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Info, "Removing unknown plugin entry without metadata, without presets and without plugin dll")); pluginsToRemove.Add(plugin); continue; } if (!plugin.HasMetadata) { // Still no metadata, probably plugin loading failure. Try again in the next version. continue; } if (_globalService.RuntimeConfiguration.StripBridgedPluginPrefix && plugin.PluginName.StartsWith("[jBridge]")) { plugin.OverridePluginName = true; plugin.OverriddenPluginName = plugin.PluginName.Replace("[jBridge]", ""); } // We now got metadata - check if there's an existing plugin with the same plugin ID. If so, // merge this plugin with the existing one if it has no presets. var existingPlugin = (from p in _globalService.Plugins where p.VstPluginId == plugin.VstPluginId && p.PluginId != plugin.PluginId && plugin.IsPresent && !pluginsToRemove.Contains(p) select p) .FirstOrDefault(); if (existingPlugin == null) { continue; } if (plugin.Presets.Count == 0) { // There's an existing plugin which this plugin can be merged into. Schedule it for removal pluginsToRemove.Add(plugin); mergedPlugins.Add((oldPlugin: plugin, mergedIntoPlugin: existingPlugin)); if (existingPlugin.PluginLocation == null) { if (Core.UseDispatcher) { await _dispatcherService.InvokeAsync(() => { existingPlugin.PluginLocation = plugin.PluginLocation; }); } else { existingPlugin.PluginLocation = plugin.PluginLocation; } } else { existingPlugin.PluginLocations.Add(plugin.PluginLocation); existingPlugin.EnsurePluginLocationIsPresent(); } } else if (existingPlugin.Presets.Count == 0) { // The existing plugin has no presets - remove it! pluginsToRemove.Add(existingPlugin); mergedPlugins.Add((oldPlugin: existingPlugin, mergedIntoPlugin: plugin)); if (plugin.PluginLocation == null) { if (Core.UseDispatcher) { await _dispatcherService.InvokeAsync(() => { plugin.PluginLocation = existingPlugin.PluginLocation; }); } else { plugin.PluginLocation = existingPlugin.PluginLocation; } } else { plugin.PluginLocations.Add(existingPlugin.PluginLocation); existingPlugin.EnsurePluginLocationIsPresent(); } } } catch (Exception e) { applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error, $"Unable to load metadata for {plugin.DllFilename} because of {e.GetType().FullName} {e.Message}")); } await _dispatcherService.InvokeAsync(() => { plugin.NativeInstrumentsResource.Load(plugin); }); } return(pluginsToRemove, mergedPlugins); }
public async Task TestPluginUpdate() { var pluginTestFilename = "Surge-new.dll"; var newPluginTestFilename = "Surge-old.dll"; var pluginTestDirectory = Path.Combine(Directory.GetCurrentDirectory(), @"TestData\VstPlugins"); var pluginSourceDirectory = Path.Combine(Directory.GetCurrentDirectory(), @"Resources"); var pluginSourcePath = Path.Combine(pluginSourceDirectory, pluginTestFilename); var newPluginSourcePath = Path.Combine(pluginSourceDirectory, newPluginTestFilename); var pluginTestPath = Path.Combine(pluginTestDirectory, pluginTestFilename); Directory.CreateDirectory(pluginTestDirectory); File.Delete(pluginTestPath); File.Copy(pluginSourcePath, pluginTestPath); var pluginService = Fixture.GetServiceLocator().ResolveType <PluginService>(); var globalService = Fixture.GetServiceLocator().ResolveType <GlobalService>(); globalService.Plugins.Clear(); var applicationService = Fixture.GetServiceLocator().ResolveType <IApplicationService>(); Fixture.StartPool(); globalService.RuntimeConfiguration.VstDirectories.Add(new VstDirectory { Path = pluginTestDirectory, Active = true }); _output.WriteLine("Refreshing plugins 1/2"); await Fixture.GetServiceLocator().ResolveType <RefreshPluginsCommand>().ExecuteAsync(); var progress = new ApplicationProgress { Progress = new Progress <CountProgress>(), LogReporter = new LogReporter(new MiniMemoryLogger()), CancellationToken = new CancellationTokenSource().Token }; _output.WriteLine("Updating metadata 1/2"); await pluginService.UpdateMetadata(globalService.Plugins, progress); applicationService.GetApplicationOperationErrors().Should().BeEmpty(); globalService.Plugins.Count.Should().Be(1); globalService.Plugins.First().PluginLocations.Count.Should().Be(1); globalService.Plugins.First().PluginLocations.First().IsPresent.Should().BeTrue(); globalService.Plugins.First().PluginLocations.First().LastMetadataAnalysisVersion.Should() .Be(globalService.PresetMagicianVersion); globalService.Plugins.First().PluginLocations.First().HasMetadata.Should().BeTrue(); globalService.Plugins.First().IsPresent.Should().BeTrue(); globalService.Plugins.First().HasMetadata.Should().BeTrue(); Fixture.StopPool(); await Task.Delay(5000); Fixture.StartPool(); File.Delete(pluginTestPath); File.Copy(newPluginSourcePath, pluginTestPath); _output.WriteLine("Refreshing plugins 2/2"); await Fixture.GetServiceLocator().ResolveType <RefreshPluginsCommand>().ExecuteAsync(); applicationService.GetApplicationOperationErrors().Should().BeEmpty(); globalService.Plugins.Count.Should().Be(2); globalService.Plugins.First().IsPresent.Should().BeFalse(); globalService.Plugins[1].IsPresent.Should().BeTrue(); _output.WriteLine("Updating metadata 2/2"); var pluginsToRemove = await pluginService.UpdateMetadata(globalService.Plugins, progress); globalService.Plugins.RemoveItems(pluginsToRemove.removedPlugins); applicationService.GetApplicationOperationErrors().Should().BeEmpty(); globalService.Plugins.Count.Should().Be(1); globalService.Plugins.First().IsPresent.Should().BeTrue(); Fixture.StopPool(); }
public async Task <bool> CreateApplicationProgressAsync(int applicationId, int profileId) { try { var userInfo = await _appDbContext.UserInfos.Include(k => k.User).FirstOrDefaultAsync(k => k.UserId == profileId); var profile = await _appDbContext.Profiles .Include(k => k.ProfileEducations) .Include(k => k.ProfileWorkExperiences) .Include(k => k.ProfileAchievements) .Include(k => k.ProfileTrainings) .Include(k => k.ProfileAssessmentToolScores) .Include(k => k.ProfileMemberships) .FirstOrDefaultAsync(k => k.Id == profileId).ConfigureAwait(false); var application = await _appDbContext.Applications.FirstOrDefaultAsync(k => k.Id == applicationId); application.CompletionPercentage = 0; await _appDbContext.SaveChangesAsync(); foreach (ApplicationSectionType sectionId in Enum.GetValues(typeof(ApplicationSectionType))) { var applicationProgress = new ApplicationProgress { ApplicationId = applicationId, ApplicationSectionItemId = (int)sectionId, ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.InComplete, Created = DateTime.Now, CreatedBy = userInfo.Email, Modified = DateTime.Now, ModifiedBy = userInfo.Email }; switch (sectionId) { case ApplicationSectionType.Education: if (profile.ProfileEducations.Any()) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.WorkExperience: if (profile.ProfileWorkExperiences.Any()) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.Membership: if (profile.ProfileMemberships.Any()) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.CandidateInformation: if (profile.FirstNameEn != null && profile.SecondNameEn != null && profile.ThirdNameEn != null && profile.LastNameEn != null && profile.FirstNameAr != null && profile.SecondNameAr != null && profile.ThirdNameAr != null && profile.LastNameAr != null && profile.ResidenceCountryId.HasValue && profile.Address != null && profile.PassportNumber != null && profile.PassportIssueEmirateItemId.HasValue && profile.BirthDate.HasValue && userInfo.Mobile != null && profile.Eid != null && userInfo.User.OriginalImageFileId.HasValue) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.Training: if (profile.ProfileTrainings.Any()) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Pending; } break; case ApplicationSectionType.Achievement: if (profile.ProfileAchievements.Any()) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.ProgramDetails: applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; break; case ApplicationSectionType.Attachment: if (profile.LastEducationCertificateFileId.HasValue && profile.UaeidfileId.HasValue && profile.CvfileId.HasValue && profile.PassportFileId.HasValue && profile.FamilyBookFileId.HasValue) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; case ApplicationSectionType.AssessmentTools: var assessmentTools = await _appDbContext.BatchAssessmentTools .Include(m => m.AssessmentTool).Where(m => m.BatchId == application.BatchId) .Select(y => y.AssessmentTool).ToListAsync(); if (assessmentTools.Select(assessment => assessment.ProfileAssessmentToolScores.Where(k => k.ProfileId == profileId).OrderByDescending(k => k.Order).FirstOrDefault()?.IsCompleted ?? false).All(isCompleted => isCompleted)) { applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed; //application.CompletionPercentage += 10; } break; } await _appDbContext.ApplicationProgresses.AddAsync(applicationProgress); await _appDbContext.SaveChangesAsync(); } return(true); } catch (Exception e) { return(false); } }